}
// Destructor, frees up all memory held by remaining nodes.
-void VG_(OSet_Destroy)(AvlTree* t)
+void VG_(OSet_Destroy)(AvlTree* t, OSetNodeDestroy_t destroyNode)
{
AvlNode* n;
Int i, sz = 0;
if (n->right) stackPush(t, n->right, 1);
break;
case 3:
+ if (destroyNode) destroyNode(n);
t->free(n);
sz++;
break;
typedef struct _OSet OSet;
typedef struct _OSetNode OSetNode;
-typedef Int (*OSetCmp_t) ( void* key, void* elem );
-typedef void* (*OSetAlloc_t) ( SizeT szB );
-typedef void (*OSetFree_t) ( void* p );
+typedef Int (*OSetCmp_t) ( void* key, void* elem );
+typedef void* (*OSetAlloc_t) ( SizeT szB );
+typedef void (*OSetFree_t) ( void* p );
+typedef void (*OSetNodeDestroy_t) ( void* elem );
/*--------------------------------------------------------------------*/
/*--- Creating and destroying OSets and OSet members ---*/
// If cmp is NULL, keyOff must be zero. This is checked.
//
// * Destroy: frees all nodes in the table, plus the memory used by
-// the table itself.
+// the table itself. The passed-in function is called on each node first
+// to allow the destruction of any attached resources; if NULL it is not
+// called.
//
// * AllocNode: Allocate and zero memory for a node to go into the OSet.
// Uses the alloc function given to VG_(OSet_Create)() to allocated a node
extern OSet* VG_(OSet_Create) ( OffT keyOff, OSetCmp_t cmp,
OSetAlloc_t alloc, OSetFree_t free );
-extern void VG_(OSet_Destroy) ( OSet* os );
+extern void VG_(OSet_Destroy) ( OSet* os, OSetNodeDestroy_t destroyNode );
extern void* VG_(OSet_AllocNode) ( OSet* os, SizeT elemSize );
extern void VG_(OSet_FreeNode) ( OSet* os, void* elem );
OSet_Print(oset1, "foo", intToStr);
// Destroy the OSet
- VG_(OSet_Destroy)(oset1);
+ VG_(OSet_Destroy)(oset1, NULL);
}
}
// Destroy the OSet
- VG_(OSet_Destroy)(oset2);
+ VG_(OSet_Destroy)(oset2, NULL);
}
//-----------------------------------------------------------------------