PatchSet 7116 
Date: 2006/02/06 21:09:51
Author: guilhem
Branch: HEAD
Tag: (none) 
Log:
Kaffe-gc fixlet.

        * kaffe/kaffevm/kaffe-gc/gc-incremental.c
        (finaliserStarted): New global variable to acknowledge the finaliser
        has started.
        (gcInvokeFinaliser): Check whether the finaliser has started.
        (finaliserMan): Reordered a bit to ensure thread safety.

Members: 
        ChangeLog:1.4634->1.4635 
        kaffe/kaffevm/kaffe-gc/gc-incremental.c:1.35->1.36 

Index: kaffe/ChangeLog
diff -u kaffe/ChangeLog:1.4634 kaffe/ChangeLog:1.4635
--- kaffe/ChangeLog:1.4634      Mon Feb  6 19:56:28 2006
+++ kaffe/ChangeLog     Mon Feb  6 21:09:51 2006
@@ -1,5 +1,13 @@
 2006-02-06  Guilhem Lavaux  <[EMAIL PROTECTED]>
 
+       * kaffe/kaffevm/kaffe-gc/gc-incremental.c
+       (finaliserStarted): New global variable to acknowledge the finaliser
+       has started.
+       (gcInvokeFinaliser): Check whether the finaliser has started.
+       (finaliserMan): Reordered a bit to ensure thread safety.
+
+2006-02-06  Guilhem Lavaux  <[EMAIL PROTECTED]>
+
        * libraries/javalib/vmspecific/org/metastatic/jessie/Base64.java,
        
libraries/javalib/vmspecific/org/metastatic/jessie/CertificateHandler.java,
        
libraries/javalib/vmspecific/org/metastatic/jessie/ConsoleCertificateHandler.java,
Index: kaffe/kaffe/kaffevm/kaffe-gc/gc-incremental.c
diff -u kaffe/kaffe/kaffevm/kaffe-gc/gc-incremental.c:1.35 
kaffe/kaffe/kaffevm/kaffe-gc/gc-incremental.c:1.36
--- kaffe/kaffe/kaffevm/kaffe-gc/gc-incremental.c:1.35  Sun Dec 18 17:54:31 2005
+++ kaffe/kaffe/kaffevm/kaffe-gc/gc-incremental.c       Mon Feb  6 21:09:57 2006
@@ -78,6 +78,7 @@
 static volatile int gcDisabled = 0;
 static volatile int gcRunning = -1;
 static volatile bool finalRunning = false;
+static volatile bool finaliserStarted = false;
 #if defined(KAFFE_STATS)
 static timespent gc_time;
 static timespent sweep_time;
@@ -953,8 +954,8 @@
   Collector *gcif = (Collector*)arg;
 
   lockStaticMutex(&finman);
+  finaliserStarted = true;
   for (;;) {
-    finalRunning = false;
     while (finalRunning == false) {
       waitStaticCond(&finman, (jlong)0);
     }
@@ -964,6 +965,7 @@
     
     /* Wake up anyone waiting for the finalizer to finish */
     lockStaticMutex(&finmanend);
+    finalRunning = false;
     broadcastStaticCond(&finmanend);
     unlockStaticMutex(&finmanend);
   }
@@ -1026,22 +1028,24 @@
 void
 gcInvokeFinalizer(Collector* gcif)
 {
-
-       /* First invoke the GC */
-       KGC_invoke(gcif, 1);
-
-       /* Run the finalizer (if might already be running as a result of
-        * the GC)
-        */
-       lockStaticMutex(&finman);
-       if (finalRunning == false) {
-               finalRunning = true;
-               signalStaticCond(&finman); 
-       }
-       lockStaticMutex(&finmanend);
-       unlockStaticMutex(&finman);
-       waitStaticCond(&finmanend, (jlong)0);
-       unlockStaticMutex(&finmanend);
+  while (!finaliserStarted)
+    KTHREAD(yield)();
+  
+  /* First invoke the GC */
+  KGC_invoke(gcif, 1);
+  
+  /* Run the finalizer (if might already be running as a result of
+   * the GC)
+   */
+  lockStaticMutex(&finman);
+  if (finalRunning == false) {
+    finalRunning = true;
+    signalStaticCond(&finman); 
+  }
+  lockStaticMutex(&finmanend);
+  unlockStaticMutex(&finman);
+  waitStaticCond(&finmanend, (jlong)0);
+  unlockStaticMutex(&finmanend);
 }
 
 /*

_______________________________________________
kaffe mailing list
[email protected]
http://kaffe.org/cgi-bin/mailman/listinfo/kaffe

Reply via email to