Lazily allocate state for multi-writer instances
Multiple writers for a single instance is pretty rare, so it makes sense to lazily allocate the tables for keeping track of them. The more elegant solution would be to have a single lock-free table. Signed-off-by: Erik Boasson <eb@ilities.com>
This commit is contained in:
parent
0e888eb2ec
commit
260f8cd86b
1 changed files with 7 additions and 4 deletions
|
@ -192,30 +192,33 @@ static int lwreg_equals (const void *va, const void *vb)
|
||||||
|
|
||||||
static void lwregs_init (struct lwregs *rt)
|
static void lwregs_init (struct lwregs *rt)
|
||||||
{
|
{
|
||||||
rt->regs = ddsrt_ehh_new (sizeof (struct lwreg), 1, lwreg_hash, lwreg_equals);
|
rt->regs = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void lwregs_fini (struct lwregs *rt)
|
static void lwregs_fini (struct lwregs *rt)
|
||||||
{
|
{
|
||||||
ddsrt_ehh_free (rt->regs);
|
if (rt->regs)
|
||||||
|
ddsrt_ehh_free (rt->regs);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int lwregs_contains (struct lwregs *rt, uint64_t iid, uint64_t wr_iid)
|
static int lwregs_contains (struct lwregs *rt, uint64_t iid, uint64_t wr_iid)
|
||||||
{
|
{
|
||||||
struct lwreg dummy = { .iid = iid, .wr_iid = wr_iid };
|
struct lwreg dummy = { .iid = iid, .wr_iid = wr_iid };
|
||||||
return ddsrt_ehh_lookup (rt->regs, &dummy) != NULL;
|
return rt->regs != NULL && ddsrt_ehh_lookup (rt->regs, &dummy) != NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int lwregs_add (struct lwregs *rt, uint64_t iid, uint64_t wr_iid)
|
static int lwregs_add (struct lwregs *rt, uint64_t iid, uint64_t wr_iid)
|
||||||
{
|
{
|
||||||
struct lwreg dummy = { .iid = iid, .wr_iid = wr_iid };
|
struct lwreg dummy = { .iid = iid, .wr_iid = wr_iid };
|
||||||
|
if (rt->regs == NULL)
|
||||||
|
rt->regs = ddsrt_ehh_new (sizeof (struct lwreg), 1, lwreg_hash, lwreg_equals);
|
||||||
return ddsrt_ehh_add (rt->regs, &dummy);
|
return ddsrt_ehh_add (rt->regs, &dummy);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int lwregs_delete (struct lwregs *rt, uint64_t iid, uint64_t wr_iid)
|
static int lwregs_delete (struct lwregs *rt, uint64_t iid, uint64_t wr_iid)
|
||||||
{
|
{
|
||||||
struct lwreg dummy = { .iid = iid, .wr_iid = wr_iid };
|
struct lwreg dummy = { .iid = iid, .wr_iid = wr_iid };
|
||||||
return ddsrt_ehh_remove (rt->regs, &dummy);
|
return rt->regs != NULL && ddsrt_ehh_remove (rt->regs, &dummy);
|
||||||
}
|
}
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue