idnode: Fix the short idnode unique number detection
This commit is contained in:
parent
e6d2f393fa
commit
d043dbe24b
1 changed files with 23 additions and 10 deletions
33
src/idnode.c
33
src/idnode.c
|
@ -58,14 +58,6 @@ in_cmp(const idnode_t *a, const idnode_t *b)
|
||||||
return memcmp(a->in_uuid, b->in_uuid, sizeof(a->in_uuid));
|
return memcmp(a->in_uuid, b->in_uuid, sizeof(a->in_uuid));
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
|
||||||
in_cmp_short(const idnode_t *a, const idnode_t *b)
|
|
||||||
{
|
|
||||||
if (a->in_class != b->in_class)
|
|
||||||
return memcmp(a->in_uuid, b->in_uuid, sizeof(a->in_uuid));
|
|
||||||
return idnode_get_short_uuid(b) - idnode_get_short_uuid(a);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* **************************************************************************
|
/* **************************************************************************
|
||||||
* Registration
|
* Registration
|
||||||
* *************************************************************************/
|
* *************************************************************************/
|
||||||
|
@ -102,6 +94,17 @@ idnode_done(void)
|
||||||
SKEL_FREE(idclasses_skel);
|
SKEL_FREE(idclasses_skel);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static const idclass_t *
|
||||||
|
idnode_root_class(idnode_t *in)
|
||||||
|
{
|
||||||
|
const idclass_t *idc;
|
||||||
|
|
||||||
|
idc = in->in_class;
|
||||||
|
while (idc && idc->ic_super)
|
||||||
|
idc = idc->ic_super;
|
||||||
|
return idc;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
@ -112,6 +115,8 @@ idnode_insert(idnode_t *in, const char *uuid, const idclass_t *class, int flags)
|
||||||
lock_assert(&global_lock);
|
lock_assert(&global_lock);
|
||||||
tvh_uuid_t u;
|
tvh_uuid_t u;
|
||||||
int retries = 5;
|
int retries = 5;
|
||||||
|
uint32_t u32;
|
||||||
|
const idclass_t *idc;;
|
||||||
|
|
||||||
in->in_class = class;
|
in->in_class = class;
|
||||||
do {
|
do {
|
||||||
|
@ -121,8 +126,16 @@ idnode_insert(idnode_t *in, const char *uuid, const idclass_t *class, int flags)
|
||||||
memcpy(in->in_uuid, u.bin, sizeof(in->in_uuid));
|
memcpy(in->in_uuid, u.bin, sizeof(in->in_uuid));
|
||||||
|
|
||||||
c = NULL;
|
c = NULL;
|
||||||
if (flags & IDNODE_SHORT_UUID)
|
if (flags & IDNODE_SHORT_UUID) {
|
||||||
c = RB_FIND(&idnodes, in, in_link, in_cmp_short);
|
u32 = idnode_get_short_uuid(in);
|
||||||
|
idc = idnode_root_class(in);
|
||||||
|
RB_FOREACH(c, &idnodes, in_link) {
|
||||||
|
if (idc != idnode_root_class(c))
|
||||||
|
continue;
|
||||||
|
if (idnode_get_short_uuid(c) == u32)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (c == NULL)
|
if (c == NULL)
|
||||||
c = RB_INSERT_SORTED(&idnodes, in, in_link, in_cmp);
|
c = RB_INSERT_SORTED(&idnodes, in, in_link, in_cmp);
|
||||||
|
|
Loading…
Add table
Reference in a new issue