static void free_Node(Node x) { if (x->left) free_Node(x->left); if (x->right) free_Node(x->right); free(x); }
void free_Node( INode* self ) { if ( self->sibling ) { free_Node( self->sibling ); } if ( self->child ) { free_Node( self->child ); } if ( self->rightChild ) { free_Node( self->rightChild ); } if ( self->key ) { free_CharString( self->key ); } CRuntime_free( self ); }
static void TimeConstruction(int depth) { long tStart, tFinish; int iNumIters = NumIters(depth); Node tempTree; int i; printf ("Creating %d trees of depth %d\n", iNumIters, depth); for (i = 0; i < iNumIters; ++i) { tempTree = leaf_Node(); Populate(depth, tempTree); free_Node(tempTree); tempTree = 0; } for (i = 0; i < iNumIters; ++i) { tempTree = MakeTree(depth); free_Node(tempTree); tempTree = 0; } }
main() { Node root; Node longLivedTree; Node tempTree; double *array; int i; int d; printf ("Garbage Collector Test\n"); printf (" Live storage will peak at %d bytes.\n\n", 2 * sizeof(struct Node0) * TreeSize(kLongLivedTreeDepth) + sizeof(double) * kArraySize); printf (" Stretching memory with a binary tree of depth %d\n", kStretchTreeDepth); PrintDiagnostics(); /* Stretch the memory space quickly */ tempTree = MakeTree(kStretchTreeDepth); free_Node(tempTree); tempTree = 0; /* Create a long lived object */ printf (" Creating a long-lived binary tree of depth %d\n", kLongLivedTreeDepth); longLivedTree = leaf_Node(); Populate(kLongLivedTreeDepth, longLivedTree); /* Create long-lived array, filling half of it */ printf (" Creating a long-lived array of %d doubles\n", kArraySize); array = (double *) malloc(kArraySize*sizeof(double)); for (i = 0; i < kArraySize/2; ++i) { array[i] = 1.0/i; /* sic */ } PrintDiagnostics(); for (d = kMinTreeDepth; d <= kMaxTreeDepth; d += 2) { TimeConstruction(d); } if (longLivedTree == 0 || array[1000] != 1.0/1000) printf ("Failed\n"); /* Fake reference to LongLivedTree */ /* and array */ /* to keep them from being optimized away */ PrintDiagnostics(); }