Garbarge Collected Guards
The /gc guard modifier enables this feature to remove an accessed (key,0) pair once the node function is done with it. The example I will describe below demonstrates its usefulness (based on gctest1 from the OFlux repo):
exclusive/gc G (int v) => int *; /* remove the /gc to cause this program to leak memory */ node GenerateKey () => (int key); node Populate (int key, guard G(key) as g) => (int key); /* populates the rval guard */ node Depopulate (int key, guard G(key) as g) => (); /* depopulates the rval guard */ source GenerateKey -> Populate -> Depopulate;
The plan is to have the source node GenerateKey generate a number, have node Populate populate the G guard with that number as a key, then have node Depopulate depopulate it (by assigning it a value of (int *) 0) on the same integer key. The following C++ implementation of the node functions carry out this plan:
#include <stdio.h> #include "OFluxGenerate_gctest1.h" int GenerateKey(const GenerateKey_in * , GenerateKey_out * out , GenerateKey_atoms *) { static int x = 0; out->key = ++x; return 0; } int Populate(const Populate_in *in , Populate_out *out , Populate_atoms * atoms) { int * & g = atoms->g(); static int x = 0; out->key = in->key; if(g == NULL) { g = &x; } return 0; } int Depopulate(const Depopulate_in * in , Depopulate_out * , Depopulate_atoms * atoms) { int * & g = atoms->g(); g = NULL; return 0; }
Summary
Building this code without the /gc guard modifier causes the Gb guard's underlying map to explode in size (eventually running out of memory on a 32-bit system once it hits the 4G mark). In some cases, the key space is a known finite set that does not grow values dynamically very much, and the need to remove those unused (key,0) pairs from the underlying map is not there (and the resulting speed hit of removing things is unnecessary). Depending on the application, it could be that the value associated with key will transition from 0 to a real object again at some point in the near future with high probability. If that is the case, the default setting with no garbage collection is recommended.
No comments:
Post a Comment