Add IS_TRACKED and IS_MOVED macros. This makes the logic a little more clear.

This commit is contained in:
Neil Schemenauer 2002-05-21 15:53:24 +00:00
parent 0ebac97058
commit a2b11ecb08
1 changed files with 10 additions and 7 deletions

View File

@ -28,6 +28,8 @@
/* Get the object given the GC head */ /* Get the object given the GC head */
#define FROM_GC(g) ((PyObject *)(((PyGC_Head *)g)+1)) #define FROM_GC(g) ((PyObject *)(((PyGC_Head *)g)+1))
/* True if an object is tracked by the GC */
#define IS_TRACKED(o) ((AS_GC(o))->gc.gc_next != NULL)
/*** Global GC state ***/ /*** Global GC state ***/
@ -73,6 +75,9 @@ static int debug;
/* Special gc_refs value */ /* Special gc_refs value */
#define GC_MOVED -123 #define GC_MOVED -123
/* True if an object has been moved to the older generation */
#define IS_MOVED(o) ((AS_GC(o))->gc.gc_refs == GC_MOVED)
/* list of uncollectable objects */ /* list of uncollectable objects */
static PyObject *garbage; static PyObject *garbage;
@ -170,8 +175,7 @@ static int
visit_decref(PyObject *op, void *data) visit_decref(PyObject *op, void *data)
{ {
if (op && PyObject_IS_GC(op)) { if (op && PyObject_IS_GC(op)) {
PyGC_Head *gc = AS_GC(op); if (IS_TRACKED(op))
if (gc->gc.gc_next != NULL)
AS_GC(op)->gc.gc_refs--; AS_GC(op)->gc.gc_refs--;
} }
return 0; return 0;
@ -212,8 +216,8 @@ static int
visit_move(PyObject *op, PyGC_Head *tolist) visit_move(PyObject *op, PyGC_Head *tolist)
{ {
if (PyObject_IS_GC(op)) { if (PyObject_IS_GC(op)) {
PyGC_Head *gc = AS_GC(op); if (IS_TRACKED(op) && !IS_MOVED(op)) {
if (gc->gc.gc_next != NULL && gc->gc.gc_refs != GC_MOVED) { PyGC_Head *gc = AS_GC(op);
gc_list_remove(gc); gc_list_remove(gc);
gc_list_append(gc, tolist); gc_list_append(gc, tolist);
gc->gc.gc_refs = GC_MOVED; gc->gc.gc_refs = GC_MOVED;
@ -856,8 +860,7 @@ void
PyObject_GC_UnTrack(void *op) PyObject_GC_UnTrack(void *op)
{ {
#ifdef WITH_CYCLE_GC #ifdef WITH_CYCLE_GC
PyGC_Head *gc = AS_GC(op); if (IS_TRACKED(op))
if (gc->gc.gc_next != NULL)
_PyObject_GC_UNTRACK(op); _PyObject_GC_UNTRACK(op);
#endif #endif
} }
@ -941,7 +944,7 @@ PyObject_GC_Del(void *op)
{ {
#ifdef WITH_CYCLE_GC #ifdef WITH_CYCLE_GC
PyGC_Head *g = AS_GC(op); PyGC_Head *g = AS_GC(op);
if (g->gc.gc_next != NULL) if (IS_TRACKED(op))
gc_list_remove(g); gc_list_remove(g);
if (generations[0].count > 0) { if (generations[0].count > 0) {
generations[0].count--; generations[0].count--;