You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

75 lines
1.7 KiB
C

/**
* Modified autorelease pool which performs automatic detection and collection
* of garbage cycles.
*/
typedef struct _GCThread
{
/**
* Next thread in the list.
*/
struct _GCThread *next;
/**
* Last thread in the list.
*/
struct _GCThread *last;
/**
* Map of objects that haven't yet escaped from the thread.
*/
void *unescapedObjects;
/**
* Top of the stack.
*/
void *stackTop;
/**
* Top of the stack.
*/
void *stackBottom;
/**
* Per-thread buffer into which objects that are potentially roots in garbage
* cycles are stored.
*/
id *cycleBuffer;
/**
* Insert point into cycle buffer
*/
unsigned int cycleBufferInsert;
/**
* Buffer for objects whose reference count has reached 0. These may be
* freed if there are no references to them on the stack.
*/
id *freeBuffer;
/**
* Insert point into to-free buffer
*/
unsigned int freeBufferInsert;
/**
* Condition variable prevents the thread from really exiting (and having
* its stack deallocated) until the GC thread has removed the thread.
*/
void *exitCondition;
/**
* The generation when this stack was last scanned.
*/
volatile int scannedInGeneration;
} GCThread;
extern GCThread *GCThreadList;
/**
* Registers the current thread for garbage collection.
*/
void GCRegisterThread(void);
/**
* Adds an object for tracing or cycle detection or tracing.
*/
void GCAddObject(id anObject);
/**
* Drains the objects queued for (potential) collection on the current thread.
* Passing YES as the argument forces a full sweep of the heap-allocated traced
* regions.
*
* Note that this method performs the collection in a second thread, so some
* objects may not be collected until after it has run.
*/
void GCDrain(BOOL forceCollect);