Node functions not quite working as expected
These 2 are supposed to managed pointers for various object types but somehow makeNode() is hitting a situation where it's re-allocating objects that are already in use, I'm not seeing what's causing it, anyone have any ideas?
Code:
SHARED_EXP dint makeNode( void *ud, NODES *Nodes, void **Node )
{
uint i, j = 0, *k;
dint err;
BUFFER *Shared;
BUFFER *Erased;
void **nodes, **object = NULL;
if ( *Node )
return 0;
err = makeNodes( ud, Nodes );
if ( err )
{
ECHO_ERRNO( stdout, err );
return err;
}
Shared = Nodes->shared;
Erased = Nodes->erased;
nodes = (void**)(Shared->array);
do
{
i = Erased->count;
if ( i )
{
uint *clear = Erased->array;
j = clear[--i];
clear[i] = 0;
object = nodes + j;
Erased->count--;
break;
}
j = Shared->count + !(Shared->count);
if ( Shared->total <= j )
{
err = markBuffert( ud, Shared, j + bitsof(int) );
if ( err )
{
ECHO_ERRNO( stdout, err );
return err;
}
}
nodes = (void**)(Shared->array);
object = nodes + j;
*object = NULL;
err = makeObject( ud, object, Nodes->Vsize, Nodes->makeCB );
if ( err )
{
ECHO_ERRNO( stdout, err );
return err;
}
}
while (0);
*Node = *object;
k = Nodes->gaveCB( *object );
assert( !(*k) );
*k = j;
return 0;
}
SHARED_EXP dint voidNode( void *ud, NODES *Nodes, void **Node )
{
uint j = 0, *k;
dint err;
BUFFER *Shared = Nodes->shared;
BUFFER *Erased = Nodes->erased;
void **nodes, **object = NULL;
uint *clear;
if ( !Shared || !(*Node) )
return 0;
k = Nodes->gaveCB( *Node );
nodes = (void**)(Shared->array);
object = nodes + *k;
err = Nodes->termCB( ud, *object );
if ( err )
{
ECHO_ERRNO( stdout, err );
return err;
}
*Node = NULL;
/* Try to keep the node available for re-use */
j = Erased->count;
err = growBufferc( ud, Erased, 1 );
if ( err )
{
ECHO_ERRNO( stdout, err );
voidObject( ud, object, Nodes->voidCB );
return err;
}
clear = Erased->array;
clear[j] = *k;
*k = 0;
return 0;
}