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;
}