[kaffe] CVS kaffe (robilad): made boehm-gc gc-refs.c implementation closer to kaffe-gc one

Kaffe CVS cvs-commits at kaffe.org
Fri Jan 18 15:10:53 PST 2008


PatchSet 7690 
Date: 2008/01/18 23:08:51
Author: robilad
Branch: HEAD
Tag: (none) 
Log:
made boehm-gc gc-refs.c implementation closer to kaffe-gc one

2008-01-19  Dalibor Topic  <robilad at kaffe.org>

        * kaffe/kaffevm/boehm-gc/gc-refs.c: Added debugging code from kaffe-gc
        version. Use KaffeGC_malloc & KaffeGC_free instead of boehm-specific
        macros. Rearranged functions to match layout in kaffe-gc version in
        preparation for unifying them again.

Members: 
	ChangeLog:1.5192->1.5193 
	kaffe/kaffevm/boehm-gc/gc-refs.c:1.9->1.10 

Index: kaffe/ChangeLog
diff -u kaffe/ChangeLog:1.5192 kaffe/ChangeLog:1.5193
--- kaffe/ChangeLog:1.5192	Fri Jan 18 22:19:54 2008
+++ kaffe/ChangeLog	Fri Jan 18 23:08:51 2008
@@ -1,3 +1,10 @@
+2008-01-19  Dalibor Topic  <robilad at kaffe.org>
+
+	* kaffe/kaffevm/boehm-gc/gc-refs.c: Added debugging code from kaffe-gc
+	version. Use KaffeGC_malloc & KaffeGC_free instead of boehm-specific
+	macros. Rearranged functions to match layout in kaffe-gc version in 
+	preparation for unifying them again.
+
 2008-01-18  Dalibor Topic  <robilad at kaffe.org>
 
 	* kaffe/kaffevm/Makefile.am (DIST_SUBDIRS): Removed jni and verifier dirs.
Index: kaffe/kaffe/kaffevm/boehm-gc/gc-refs.c
diff -u kaffe/kaffe/kaffevm/boehm-gc/gc-refs.c:1.9 kaffe/kaffe/kaffevm/boehm-gc/gc-refs.c:1.10
--- kaffe/kaffe/kaffevm/boehm-gc/gc-refs.c:1.9	Tue Aug  7 01:44:49 2007
+++ kaffe/kaffe/kaffevm/boehm-gc/gc-refs.c	Fri Jan 18 23:08:53 2008
@@ -27,8 +27,6 @@
 #include "java_lang_Thread.h"
 #include "gc2.h"
 
-#include <gc/gc.h>
-
 #define	REFOBJHASHSZ	128
 typedef struct _strongRefObject {
   const void*		mem;
@@ -71,6 +69,10 @@
   uint32 idx;
   strongRefObject* obj;
 
+
+  DBG(REFERENCE, dprintf("Adding persistent reference for object %p\n",
+                 mem); );
+
   idx = REFOBJHASH(mem);
   for (obj = strongRefObjects.hash[idx]; obj != 0; obj = obj->next) {
     /* Found it - just increase reference */
@@ -81,7 +83,7 @@
   }
 
   /* Not found - create a new one */
-  obj = (strongRefObject*)GC_MALLOC_UNCOLLECTABLE(sizeof(strongRefObject));
+  obj = (strongRefObject*)KGC_malloc(collector, sizeof(strongRefObject), KGC_ALLOC_REF);
   if (!obj)
     return false;
 	
@@ -94,6 +96,44 @@
   return true;
 }
 
+/*
+ * Remove a persistent reference to an object.  If the count becomes
+ * zero then the reference is removed.
+ */
+bool
+KaffeGC_rmRef(Collector *collector UNUSED, void* mem)
+{
+  uint32 idx;
+  strongRefObject** objp;
+  strongRefObject* obj;
+
+
+  DBG(REFERENCE, dprintf("Removing persistent reference for object %p\n",
+                 mem); );
+
+  idx = REFOBJHASH(mem);
+  mem = ALIGN_BACKWARD(mem);
+
+  lockStaticMutex(&strongRefLock);
+  for (objp = &strongRefObjects.hash[idx]; *objp != 0; objp = &obj->next) {
+    obj = *objp;
+    /* Found it - just decrease reference */
+    if (obj->mem == mem) {
+      obj->ref--;
+      if (obj->ref == 0) {
+	*objp = obj->next;
+	KGC_free(collector, obj);
+      }
+      unlockStaticMutex(&strongRefLock);
+      return true;
+    }
+  }
+  unlockStaticMutex(&strongRefLock);
+
+  /* Not found!! */
+  return false;
+}
+
 /**
  * Grow the weak reference list for a weakly referenced object.
  * Assert: weakRefLock is held by the calling thread.
@@ -121,7 +161,7 @@
     {
       previousSize = obj->allRefSize;
       unlockStaticMutex(&weakRefLock);
-      refs = GC_MALLOC_UNCOLLECTABLE(size * sizeof(void **));
+      refs = KGC_malloc(collector, size * sizeof(void **), KGC_ALLOC_VMWEAKREF);
       lockStaticMutex(&weakRefLock);
       if (refs == NULL)
 	{
@@ -133,7 +173,7 @@
       if (previousSize != obj->allRefSize)
 	{
 	  unlockStaticMutex(&weakRefLock);
-	  GC_FREE(refs);
+	  KGC_free(collector, refs);
 	  lockStaticMutex(&weakRefLock);
 	  continue;
 	}
@@ -147,7 +187,7 @@
 	  memcpy(refs, oldRefs, sizeof(void **) * obj->ref);
       
 	  unlockStaticMutex(&weakRefLock);
-	  GC_FREE(oldRefs);
+	  KGC_free(collector, oldRefs);
 	  lockStaticMutex(&weakRefLock);
 	}
 
@@ -157,82 +197,90 @@
   while (1);
 }
 
-/*
- * Remove a persistent reference to an object.  If the count becomes
- * zero then the reference is removed.
- */
-bool
-KaffeGC_rmRef(Collector *collector UNUSED, void* mem)
+
+static weakRefObject *
+findWeakRefObject(void *mem)
 {
-  uint32 idx;
-  strongRefObject** objp;
-  strongRefObject* obj;
+  int idx;
+  weakRefObject* obj;
 
   idx = REFOBJHASH(mem);
-  mem = ALIGN_BACKWARD(mem);
 
-  lockStaticMutex(&strongRefLock);
-  for (objp = &strongRefObjects.hash[idx]; *objp != 0; objp = &obj->next) {
-    obj = *objp;
-    /* Found it - just decrease reference */
-    if (obj->mem == mem) {
-      obj->ref--;
-      if (obj->ref == 0) {
-	*objp = obj->next;
-	GC_FREE(obj);
-      }
-      unlockStaticMutex(&strongRefLock);
-      return true;
-    }
+  for (obj = weakRefObjects.hash[idx]; obj != 0; obj = obj->next) {
+    /* Found it - just register a new weak reference */
+    if (obj->mem == mem)
+      return obj;
   }
-  unlockStaticMutex(&strongRefLock);
 
-  /* Not found!! */
-  return false;
+  return NULL;
+}     
+
+static bool
+insertInWeakRef(Collector *collector, weakRefObject *obj, void **refobj)
+{
+  obj->ref++;
+  
+  if (obj->ref >= obj->allRefSize)
+    if (!resizeWeakReferenceObject(collector, obj, obj->ref * 2 + 1))
+      return false;
+  
+  obj->allRefs[obj->ref-1] = refobj;
+
+  return true;
 }
 
 bool
 KaffeGC_addWeakRef(Collector *collector, void* mem, void** refobj)
 {
+  weakRefObject* obj, *obj2;
   int idx;
-  weakRefObject* obj;
 
-  idx = REFOBJHASH(mem);
+  DBG(REFERENCE, dprintf("Adding weak reference for object %p\n",
+                 mem); );
 
   lockStaticMutex(&weakRefLock);
-  for (obj = weakRefObjects.hash[idx]; obj != 0; obj = obj->next) {
-    /* Found it - just register a new weak reference */
-    if (obj->mem == mem) {
-      obj->ref++;
-
-      if (obj->ref >= obj->allRefSize)
-	if (!resizeWeakReferenceObject(collector, obj, obj->ref * 2 + 1))
-	  {
-	    unlockStaticMutex(&weakRefLock);
-	    return false;
-	  }
-
-      obj->allRefs[obj->ref-1] = refobj;
-
+  obj = findWeakRefObject(mem);
+  if (obj != NULL)
+    {
+      bool ret = insertInWeakRef(collector, obj, refobj);
+      
       unlockStaticMutex(&weakRefLock);
-      return true;
+      return ret;
     }
-  }
 
   /* Not found - create a new one */
-  obj = (weakRefObject*)GC_MALLOC_UNCOLLECTABLE(sizeof(weakRefObject));
+  unlockStaticMutex(&weakRefLock);
+  obj = (weakRefObject*)KGC_malloc(collector, sizeof(weakRefObject), KGC_ALLOC_VMWEAKREF);
   if (obj == NULL)
-    {
-      unlockStaticMutex(&weakRefLock);
-      return false;
-    }
+    return false;
 
   obj->mem = mem;
   obj->ref = 1;
-  unlockStaticMutex(&weakRefLock);
-  obj->allRefs = (void ***)GC_MALLOC_UNCOLLECTABLE(sizeof(void ***));
+  obj->allRefs = (void ***)KGC_malloc(collector, sizeof(void ***), KGC_ALLOC_VMWEAKREF);
   lockStaticMutex(&weakRefLock);
   obj->allRefs[0] = refobj;
+
+  /* Now we check whether has inserted the reference
+   * in the meantime.
+   */
+  obj2 = findWeakRefObject(mem);
+  if (obj2 != NULL)
+    {
+      bool ret;
+      
+      /* Calling free is safe as the GC thread is not
+       * called at that time.
+       */
+      KGC_free(collector, obj->allRefs);
+      KGC_free(collector, obj);
+
+      ret = insertInWeakRef(collector, obj2, refobj);
+      unlockStaticMutex(&weakRefLock);
+
+      return ret;
+    }
+
+  idx = REFOBJHASH(mem);
   obj->next = weakRefObjects.hash[idx];
   weakRefObjects.hash[idx] = obj;
   unlockStaticMutex(&weakRefLock);
@@ -248,6 +296,10 @@
   weakRefObject* obj;
   unsigned int i;
 
+  
+  DBG(REFERENCE, dprintf("Removing weak reference for object %p \n",
+                 mem); );
+
   idx = REFOBJHASH(mem);
 
   lockStaticMutex(&weakRefLock);
@@ -279,8 +331,8 @@
 	  
 	  unlockStaticMutex(&weakRefLock);
 	  if (obj->allRefs != NULL)
-	    GC_FREE(obj->allRefs);
-	  GC_FREE(obj);
+	    KGC_free(collector, obj->allRefs);
+	  KGC_free(collector, obj);
 	  lockStaticMutex(&weakRefLock);
 	}
 	unlockStaticMutex(&weakRefLock);
@@ -309,6 +361,9 @@
   weakRefObject* obj;
   unsigned int i;
 
+  DBG(REFERENCE, dprintf("Clearing all weak references for object %p\n",
+                 mem); );
+
   idx = REFOBJHASH(mem);
 
   lockStaticMutex(&weakRefLock);
@@ -324,7 +379,7 @@
 
 	  if (obj->allRefs != NULL)
 	    {
-	      GC_FREE(obj->allRefs);
+	      KGC_free(collector, obj->allRefs);
 	      obj->allRefs = NULL;
 	    }
 
@@ -335,7 +390,7 @@
 	  obj->next = NULL;
 	  obj->destroyed = true;
 	  if (obj->keep_object == 0)
-	    GC_FREE(obj);
+	    KGC_free(collector, obj);
 	  
 	  unlockStaticMutex(&weakRefLock);
 	  return;




More information about the kaffe mailing list