--- ORBit2-2.14.3/src/orb/orb-core/orbit-object.c.ref-leaks 2003-10-29 07:22:12.000000000 -0500 +++ ORBit2-2.14.3/src/orb/orb-core/orbit-object.c 2006-12-08 12:03:55.000000000 -0500 @@ -115,16 +115,22 @@ obj->refs = 0; } +#define ORBIT_REFCOUNT_IMMORTAL (ORBIT_REFCOUNT_MAX / 2) + gpointer ORBit_RootObject_duplicate (gpointer obj) { ORBit_RootObject robj = obj; - if (robj && robj->refs != ORBIT_REFCOUNT_STATIC) { + if (robj && robj->refs != ORBIT_REFCOUNT_STATIC && + robj->refs != ORBIT_REFCOUNT_IMMORTAL) { LINK_MUTEX_LOCK (ORBit_RootObject_lifecycle_lock); robj->refs++; total_refs++; LINK_MUTEX_UNLOCK (ORBit_RootObject_lifecycle_lock); + if (robj->refs == ORBIT_REFCOUNT_IMMORTAL) + g_warning ("ORB: ORBit_RootObject %p became immortal" + " - reference leaks present", robj); } return obj; @@ -135,9 +141,13 @@ { ORBit_RootObject robj = obj; - if (robj && robj->refs != ORBIT_REFCOUNT_STATIC) { + if (robj && robj->refs != ORBIT_REFCOUNT_STATIC && + robj->refs != ORBIT_REFCOUNT_IMMORTAL) { robj->refs++; total_refs++; + if (robj->refs == ORBIT_REFCOUNT_IMMORTAL) + g_warning ("ORB: ORBit_RootObject %p became immortal" + " - reference leaks present", robj); } return obj; @@ -148,6 +158,9 @@ { g_assert (robj->refs < ORBIT_REFCOUNT_MAX && robj->refs > 0); + if (robj->refs == ORBIT_REFCOUNT_IMMORTAL) + return; + robj->refs--; total_refs--;