[kaffe] CVS kaffe (guilhem): Fixes for Boehm-GC. Deadlock problem still pending.

Kaffe CVS cvs-commits at kaffe.org
Tue Aug 3 11:42:00 PDT 2004


PatchSet 5036 
Date: 2004/08/03 18:31:08
Author: guilhem
Branch: HEAD
Tag: (none) 
Log:
Fixes for Boehm-GC. Deadlock problem still pending.

        * kaffe/kaffevm/gcFuncs.c
        (walkClass): Updated function call.

        * kaffe/kaffevm/boehm-gc/gc2.c,
        kaffe/kaffevm/boehm-gc/gc2.h
        (gcMark): New field "original_object"
        (clearAndAddDescriptor): Cleaned up.
        (finalizeObject): Call destroy function after
        having finalized.
        (finaliserMan): Removed call to jthread_yield. Added a dummy
        unlockStaticMutex.
        (gcMan): Likewise.
        (KaffeGC_realloc): Really return NULL if realloc fails.
        (KaffeGC_malloc): Return NULL if alloc fails.
        (KaffeGC_markAddress): Fixed call to GC_mark_and_push.
        (onObjectMarking): Initialize original_object.
        (KaffeGC_Init): Removed dead code.
        Include gc2.h. Moved some macros and structures to gc2.h

        * kaffe/kaffevm/boehm-gc/gcRefs.c:
        (KaffeGC_addRef): Take the object base to mark the object.
        (KaffeGC_rmRef): Likewise.
        Include gc2.h

        * kaffe/kaffevm/systems/unix-pthreads/thread-impl.c:
        (tInitSignalHandler): Define a new signal SIG_INTERRUPT to
        interrupt syscall.
        (jthread_interrupt): Use SIG_INTERRUPT.

Members: 
	ChangeLog:1.2594->1.2595 
	kaffe/kaffevm/gcFuncs.c:1.55->1.56 
	kaffe/kaffevm/boehm-gc/gc-refs.c:1.1->1.2 
	kaffe/kaffevm/boehm-gc/gc2.c:1.3->1.4 
	kaffe/kaffevm/boehm-gc/gc2.h:INITIAL->1.1 
	kaffe/kaffevm/systems/unix-pthreads/thread-impl.c:1.35->1.36 

Index: kaffe/ChangeLog
diff -u kaffe/ChangeLog:1.2594 kaffe/ChangeLog:1.2595
--- kaffe/ChangeLog:1.2594	Mon Aug  2 10:44:53 2004
+++ kaffe/ChangeLog	Tue Aug  3 18:31:08 2004
@@ -1,3 +1,34 @@
+2004-08-03  Guilhem Lavaux  <guilhem at kaffe.org>
+
+	* kaffe/kaffevm/gcFuncs.c
+	(walkClass): Updated function call.
+
+	* kaffe/kaffevm/boehm-gc/gc2.c,
+	kaffe/kaffevm/boehm-gc/gc2.h
+	(gcMark): New field "original_object"
+	(clearAndAddDescriptor): Cleaned up.
+	(finalizeObject): Call destroy function after
+	having finalized.
+	(finaliserMan): Removed call to jthread_yield. Added a dummy
+	unlockStaticMutex.
+	(gcMan): Likewise.
+	(KaffeGC_realloc): Really return NULL if realloc fails.
+	(KaffeGC_malloc): Return NULL if alloc fails.
+	(KaffeGC_markAddress): Fixed call to GC_mark_and_push.
+	(onObjectMarking): Initialize original_object.
+	(KaffeGC_Init): Removed dead code.
+	Include gc2.h. Moved some macros and structures to gc2.h
+
+	* kaffe/kaffevm/boehm-gc/gcRefs.c:
+	(KaffeGC_addRef): Take the object base to mark the object.
+	(KaffeGC_rmRef): Likewise.
+	Include gc2.h
+
+	* kaffe/kaffevm/systems/unix-pthreads/thread-impl.c:
+	(tInitSignalHandler): Define a new signal SIG_INTERRUPT to
+	interrupt syscall.
+	(jthread_interrupt): Use SIG_INTERRUPT.
+	
 2004-08-02  Guilhem Lavaux  <guilhem at kaffe.org>
 
 	* kaffe/kaffevm/Makefile.am
Index: kaffe/kaffe/kaffevm/gcFuncs.c
diff -u kaffe/kaffe/kaffevm/gcFuncs.c:1.55 kaffe/kaffe/kaffevm/gcFuncs.c:1.56
--- kaffe/kaffe/kaffevm/gcFuncs.c:1.55	Mon Aug  2 10:44:56 2004
+++ kaffe/kaffe/kaffevm/gcFuncs.c	Tue Aug  3 18:31:16 2004
@@ -343,7 +343,7 @@
  * http://sourceware.cygnus.com/ml/java-discuss/1999-q4/msg00379.html
  */
 				if (FIELD_TYPE(fld) == StringClass) {
-					KGC_markAddress(collector, *faddr);
+					KGC_markAddress(collector, gc_info, *faddr);
 				} else {
 					KGC_markObject(collector, gc_info, *faddr);
 				}
Index: kaffe/kaffe/kaffevm/boehm-gc/gc-refs.c
diff -u kaffe/kaffe/kaffevm/boehm-gc/gc-refs.c:1.1 kaffe/kaffe/kaffevm/boehm-gc/gc-refs.c:1.2
--- kaffe/kaffe/kaffevm/boehm-gc/gc-refs.c:1.1	Mon Aug  2 10:44:56 2004
+++ kaffe/kaffe/kaffevm/boehm-gc/gc-refs.c	Tue Aug  3 18:31:18 2004
@@ -66,7 +66,7 @@
   if (!obj)
     return false;
 	
-  obj->mem = mem;
+  obj->mem = ALIGN_BACKWARD(mem);
   obj->ref = 1;
   obj->next = refObjects.hash[idx];
   refObjects.hash[idx] = obj;
@@ -85,6 +85,8 @@
   refObject* obj;
 
   idx = REFOBJHASH(mem);
+  mem = ALIGN_BACKWARD(mem);
+
   for (objp = &refObjects.hash[idx]; *objp != 0; objp = &obj->next) {
     obj = *objp;
     /* Found it - just decrease reference */
Index: kaffe/kaffe/kaffevm/boehm-gc/gc2.c
diff -u kaffe/kaffe/kaffevm/boehm-gc/gc2.c:1.3 kaffe/kaffe/kaffevm/boehm-gc/gc2.c:1.4
--- kaffe/kaffe/kaffevm/boehm-gc/gc2.c:1.3	Mon Aug  2 10:44:56 2004
+++ kaffe/kaffe/kaffevm/boehm-gc/gc2.c	Tue Aug  3 18:31:18 2004
@@ -1,7 +1,7 @@
 /*
  * gc2.c
  * This interfaces the VM to the Hans-J. Boehm Incremental Garbage
- * Collector (version 6.0 alpha 7).
+ * Collector (version 6.3)
  *
  * Copyright (c) 2001
  *	Transvirtual Technologies, Inc.  All rights reserved.
@@ -30,6 +30,7 @@
 #include "thread.h"
 #include "gc-refs.h"
 #include "gc-kaffe.h"
+#include "gc2.h"
 
 extern void *GC_kaffe_malloc(size_t s);
 
@@ -45,11 +46,6 @@
         int                     mem;		/* only used ifdef STATS */
 } gcFuncs;
 
-typedef struct _gcMark {
-  struct GC_ms_entry *mark_current;
-  struct GC_ms_entry *mark_limit;
-} gcMark;
-
 static iStaticLock	gcman_lock = KAFFE_STATIC_LOCK_INITIALIZER;
 static iStaticLock	gcmanend_lock = KAFFE_STATIC_LOCK_INITIALIZER;
 static iStaticLock	finman_lock = KAFFE_STATIC_LOCK_INITIALIZER;
@@ -69,24 +65,12 @@
 
 static BoehmGarbageCollector boehm_gc;
 
-typedef struct {
-	uint8 memtype;
-	size_t memsize;
-} MemDescriptor;
-
-#define SIZEOF_DESC (((sizeof(MemDescriptor) + ALIGNMENTOF_VOIDP - 1) / ALIGNMENTOF_VOIDP) * ALIGNMENTOF_VOIDP)
-
-#define SYSTEM_SIZE(s) ((s) + SIZEOF_DESC)
-#define USER_SIZE(s) ((s) - SIZEOF_DESC)
-#define ALIGN_FORWARD(p) ((void *)((uintp)(p) + SIZEOF_DESC))
-#define ALIGN_BACKWARD(p) ((void *)((uintp)(p) - SIZEOF_DESC))
-
 static inline void
 clearAndAddDescriptor(void *mem, MemDescriptor *desc)
 {
     MemDescriptor *idx = (MemDescriptor *)mem;
-    idx[0] = *desc;
-    memset(&idx[1], 0, desc->memsize);
+    *idx = *desc;
+    memset(ALIGN_FORWARD(idx), 0, desc->memsize);
 }
 
 static void KaffeGC_InvokeGC(Collector* gcif, int mustgc);
@@ -154,8 +138,13 @@
 finalizeObject(void* ob, UNUSED void* descriptor)
 {
   MemDescriptor *desc = (MemDescriptor *)ob;
+  gcFuncs *f = &gcFunctions[desc->memtype];
+  
+  if (f->final != KGC_OBJECT_NORMAL && f->final != NULL)
+    f->final(&boehm_gc.collector, ALIGN_FORWARD(ob));
 
-  gcFunctions[desc->memtype].final(&boehm_gc.collector, ALIGN_FORWARD(ob));
+  if (f->destroy != NULL)
+    f->destroy(&boehm_gc.collector, ALIGN_FORWARD(ob));
 }
 
 static void NONRETURNING
@@ -169,7 +158,6 @@
     finalRunning = 0;
     while (finalRunning == 0) {
       waitStaticCond(&finman_lock, (jlong)0);
-      jthread_yield();
     }
     assert(finalRunning == 1);
 
@@ -178,6 +166,7 @@
     /* Wake up anyone waiting for the finalizer to finish */
     broadcastStaticCond(&finman_lock);
   }
+  unlockStaticMutex(&finman_lock);
 }
 
 
@@ -231,7 +220,6 @@
   unlockStaticMutex(&gcman_lock);
   while (gcRunning != 0) {
     waitStaticCond(&gcmanend_lock, (jlong)0);
-    jthread_yield();
   }
   unlockStaticMutex(&gcmanend_lock);
 }
@@ -301,9 +289,11 @@
     }
     desc->memtype = type;
     desc->memsize = sz;
+
+    return ALIGN_FORWARD(new_ptr);
   }
 
-  return ALIGN_FORWARD(new_ptr);
+  return NULL;
 }
 
 static void
@@ -337,17 +327,19 @@
   else
     mem = GC_kaffe_malloc(SYSTEM_SIZE(sz));
 
-  clearAndAddDescriptor(mem, &desc);
-	  
   // Attach finalizer
   if (mem != 0) {
-    if (gcFunctions[type].final != KGC_OBJECT_FIXED && 
-	gcFunctions[type].final != KGC_OBJECT_NORMAL) {
-      GC_REGISTER_FINALIZER_NO_ORDER(mem, finalizeObject, &gcFunctions[type], 0, 0);
+    clearAndAddDescriptor(mem, &desc);
+	  
+    if ( gcFunctions[type].final != KGC_OBJECT_FIXED
+	 && (gcFunctions[type].final != KGC_OBJECT_NORMAL
+	     || gcFunctions[type].destroy != NULL)) {
+      GC_REGISTER_FINALIZER_NO_ORDER(mem, finalizeObject, 0, 0, 0);
     }
+    return ALIGN_FORWARD(mem);
   }
 
-  return ALIGN_FORWARD(mem);
+  return NULL;
 }
 
 
@@ -448,7 +440,7 @@
 
   info_mark->mark_current =
     GC_mark_and_push(ALIGN_BACKWARD(mem), info_mark->mark_current, info_mark->mark_limit,
-		     (GC_PTR *)&mem);
+		     (GC_PTR *) info_mark->original_object);
 }
 
 static struct GC_ms_entry *
@@ -462,6 +454,7 @@
   
   info_mark.mark_current = mark_stack_ptr;
   info_mark.mark_limit = mark_stack_limit;
+  info_mark.original_object = addr;
 
   walkf = gcFunctions[type].walk;
   if (walkf != NULL)
@@ -486,7 +479,6 @@
 static void
 KaffeGC_Init(Collector *collector UNUSED)
 {
-  //  KGC_init = 1;
   GC_all_interior_pointers = 0;
   GC_finalizer_notifier = KaffeGC_SignalFinalizer;
   GC_java_finalization = 1;
@@ -499,7 +491,6 @@
     GC_expand_hp( Kaffe_JavaVMArgs.minHeapSize - GC_get_heap_size());
 
   GC_kaffe_init(onObjectMarking);
-  // KGC_init = 0;
 }
 
 
===================================================================
Checking out kaffe/kaffe/kaffevm/boehm-gc/gc2.h
RCS:  /home/cvs/kaffe/kaffe/kaffe/kaffevm/boehm-gc/gc2.h,v
VERS: 1.1
***************
--- /dev/null	Sun Aug  4 19:57:58 2002
+++ kaffe/kaffe/kaffevm/boehm-gc/gc2.h	Tue Aug  3 18:41:59 2004
@@ -0,0 +1,37 @@
+/*
+ * gc2.h
+ * This interfaces the VM to the Hans-J. Boehm Incremental Garbage
+ * Collector (version 6.0 alpha 7).
+ * Copyright (c) 2004
+ *      The Kaffe.org's developers. All rights reserved. 
+ *      See ChangeLog for details.
+ *
+ * See the file "license.terms" for information on usage and redistribution 
+ * of this file. 
+ */
+
+#ifndef _KAFFE_BOEHM_GC_H
+#define _KAFFE_BOEHM_GC_H
+
+#include "boehm/include/gc.h"
+#include "boehm/include/gc_mark.h"
+
+typedef struct _gcMark {
+  struct GC_ms_entry *mark_current;
+  struct GC_ms_entry *mark_limit;
+  GC_PTR original_object;
+} gcMark;
+
+typedef struct {
+	uint8 memtype;
+	size_t memsize;
+} MemDescriptor;
+
+#define SIZEOF_DESC (((sizeof(MemDescriptor) + ALIGNMENTOF_VOIDP - 1) / ALIGNMENTOF_VOIDP) * ALIGNMENTOF_VOIDP)
+
+#define SYSTEM_SIZE(s) ((s) + SIZEOF_DESC)
+#define USER_SIZE(s) ((s) - SIZEOF_DESC)
+#define ALIGN_FORWARD(p) ((void *)((uintp)(p) + SIZEOF_DESC))
+#define ALIGN_BACKWARD(p) ((void *)((uintp)(p) - SIZEOF_DESC))
+
+#endif
Index: kaffe/kaffe/kaffevm/systems/unix-pthreads/thread-impl.c
diff -u kaffe/kaffe/kaffevm/systems/unix-pthreads/thread-impl.c:1.35 kaffe/kaffe/kaffevm/systems/unix-pthreads/thread-impl.c:1.36
--- kaffe/kaffe/kaffevm/systems/unix-pthreads/thread-impl.c:1.35	Mon Aug  2 10:45:05 2004
+++ kaffe/kaffe/kaffevm/systems/unix-pthreads/thread-impl.c	Tue Aug  3 18:31:19 2004
@@ -114,6 +114,8 @@
 
 #endif
 
+#define SIG_INTERRUPT (__SIGRTMIN+2)
+
 
 /***********************************************************************
  * global data
@@ -328,7 +330,7 @@
 void
 tInitSignalHandlers (void)
 {
-  struct sigaction sigSuspend, sigResume, sigDump;
+  struct sigaction sigSuspend, sigResume, sigInterrupt, sigDump;
   unsigned int flags = 0;
 
 #if defined(SA_RESTART)
@@ -362,6 +364,11 @@
   sigaction( SIG_RESUME, &sigResume, NULL);
 #endif
 
+  sigInterrupt.sa_flags = flags;
+  sigInterrupt.sa_handler = SIG_IGN;
+  sigemptyset(&sigInterrupt.sa_mask);
+  sigaction( SIG_INTERRUPT, &sigInterrupt, NULL);
+
 #if defined(SIG_DUMP)
   sigDump.sa_flags = flags;
   sigDump.sa_handler = dump_signal_handler;
@@ -517,7 +524,7 @@
 {
   tid->interrupting = 1;
   /* We need to send some signal to interrupt syscalls. */
-  pthread_kill(tid->tid, SIG_RESUME);
+  pthread_kill(tid->tid, SIG_INTERRUPT);
 }
 
 int jthread_is_interrupted(jthread_t jt)



More information about the kaffe mailing list