PatchSet 5731 
Date: 2004/12/29 16:27:39
Author: guilhem
Branch: HEAD
Tag: (none) 
Log:
Fixlets. Brought back protections to highlight SMP bug.

        * kaffe/kaffevm/gtypes.h: New intp type for signed integer that may
        represent pointers.

        * kaffe/kaffevm/thread.c
        (nameThread): Check that the thread has been linked before returning
        the name.

        * kaffe/kaffevm/kaffe-gc/gc-mem.c
        (page_alloc): Use intp instead of intptr_t as it is not available on
        all systems.

        * kaffe/kaffevm/kaffe-gc/gc-refs.c
        (TwalkLiveThreads): Reuse jthread_walkLiveThreads_r to highlight the
        bug on SMP.

        * kaffe/kaffevm/systems/unix-jthreads/jsignal.h: Removed ignoreSignal.

        * kaffe/kaffevm/systems/unix-pthreads/syscalls.c
        (jthreadedForkExec): Save the old sigmask and restore it after fork.

        * kaffe/kaffevm/systems/unix-pthreads/thread-impl.c
        (jthread_create): Cleanup the thread queue if pthread_create fails.
        (jthread_suspendall): Temporarily changed logic to insure that all
        concerned threads receive the signal.

Members: 
        ChangeLog:1.3275->1.3276 
        kaffe/kaffevm/gtypes.h:1.14->1.15 
        kaffe/kaffevm/thread.c:1.89->1.90 
        kaffe/kaffevm/kaffe-gc/gc-mem.c:1.22->1.23 
        kaffe/kaffevm/kaffe-gc/gc-refs.c:1.9->1.10 
        kaffe/kaffevm/systems/unix-jthreads/jsignal.h:1.5->1.6 
        kaffe/kaffevm/systems/unix-pthreads/jsignal.h:1.4->1.5 
        kaffe/kaffevm/systems/unix-pthreads/signal.c:1.16->1.17 
        kaffe/kaffevm/systems/unix-pthreads/syscalls.c:1.25->1.26 
        kaffe/kaffevm/systems/unix-pthreads/thread-impl.c:1.63->1.64 

Index: kaffe/ChangeLog
diff -u kaffe/ChangeLog:1.3275 kaffe/ChangeLog:1.3276
--- kaffe/ChangeLog:1.3275      Wed Dec 29 15:47:25 2004
+++ kaffe/ChangeLog     Wed Dec 29 16:27:39 2004
@@ -1,5 +1,32 @@
 2004-12-29  Guilhem Lavaux  <[EMAIL PROTECTED]>
 
+       * kaffe/kaffevm/gtypes.h: New intp type for signed integer that may
+       represent pointers.
+
+       * kaffe/kaffevm/thread.c
+       (nameThread): Check that the thread has been linked before returning
+       the name.
+
+       * kaffe/kaffevm/kaffe-gc/gc-mem.c
+       (page_alloc): Use intp instead of intptr_t as it is not available on
+       all systems.
+       
+       * kaffe/kaffevm/kaffe-gc/gc-refs.c
+       (TwalkLiveThreads): Reuse jthread_walkLiveThreads_r to highlight the
+       bug on SMP.
+
+       * kaffe/kaffevm/systems/unix-jthreads/jsignal.h: Removed ignoreSignal.
+
+       * kaffe/kaffevm/systems/unix-pthreads/syscalls.c
+       (jthreadedForkExec): Save the old sigmask and restore it after fork.
+
+       * kaffe/kaffevm/systems/unix-pthreads/thread-impl.c
+       (jthread_create): Cleanup the thread queue if pthread_create fails.
+       (jthread_suspendall): Temporarily changed logic to insure that all
+       concerned threads receive the signal.
+
+2004-12-29  Guilhem Lavaux  <[EMAIL PROTECTED]>
+
        * config/sparc/jit-sparc.def: Renamed setEpilogueLabel to match the
        new symbol names.
 
Index: kaffe/kaffe/kaffevm/gtypes.h
diff -u kaffe/kaffe/kaffevm/gtypes.h:1.14 kaffe/kaffe/kaffevm/gtypes.h:1.15
--- kaffe/kaffe/kaffevm/gtypes.h:1.14   Wed Dec  1 02:41:51 2004
+++ kaffe/kaffe/kaffevm/gtypes.h        Wed Dec 29 16:27:42 2004
@@ -94,8 +94,10 @@
 
 #if SIZEOF_VOID_P == 4
 typedef uint32                 uintp;
+typedef int32                  intp;
 #elif SIZEOF_VOID_P == 8
 typedef uint64                 uintp;
+typedef int64                  intp;
 #else
 #error "sizeof(void*) must be 4 or 8"
 #endif
Index: kaffe/kaffe/kaffevm/thread.c
diff -u kaffe/kaffe/kaffevm/thread.c:1.89 kaffe/kaffe/kaffevm/thread.c:1.90
--- kaffe/kaffe/kaffevm/thread.c:1.89   Sat Dec 25 19:09:13 2004
+++ kaffe/kaffe/kaffevm/thread.c        Wed Dec 29 16:27:42 2004
@@ -538,7 +538,10 @@
 {
        static char buf[80];
 
-       stringJava2CBuf(unhand(unhand(tid)->thread)->name, buf, sizeof(buf));
+       if (tid != NULL && unhand(tid)->thread != NULL && 
unhand(unhand(tid)->thread)->name != NULL)
+         stringJava2CBuf(unhand(unhand(tid)->thread)->name, buf, sizeof(buf));
+       else
+         strcpy(buf, "<null name>");
 
        return buf;
 }
Index: kaffe/kaffe/kaffevm/kaffe-gc/gc-mem.c
diff -u kaffe/kaffe/kaffevm/kaffe-gc/gc-mem.c:1.22 
kaffe/kaffe/kaffevm/kaffe-gc/gc-mem.c:1.23
--- kaffe/kaffe/kaffevm/kaffe-gc/gc-mem.c:1.22  Tue Dec 21 05:50:02 2004
+++ kaffe/kaffe/kaffevm/kaffe-gc/gc-mem.c       Wed Dec 29 16:27:42 2004
@@ -980,7 +980,7 @@
         */
        for (;;) {
                int missed;
-               ptr = sbrk((intptr_t)size);
+               ptr = sbrk((intp)size);
                if (ptr == (void*)-1) {
                        ptr = NULL;
                        break;
@@ -992,7 +992,7 @@
                DBG(GCSYSALLOC,
                    dprintf("unaligned sbrk %p, missed %d bytes\n",
                            ptr, missed));
-               sbrk((intptr_t)(-size + missed));
+               sbrk((intp)(-size + missed));
        }
        CHECK_OUT_OF_MEMORY(ptr);
 
@@ -1028,7 +1028,7 @@
 #ifdef HAVE_SBRK
 static void pagefree(uintp base UNUSED, size_t size)
 {
-       sbrk((intptr_t)-size);
+       sbrk((intp)-size);
 }
 #else
 static void pagefree(uintp base, size_t size UNUSED)
Index: kaffe/kaffe/kaffevm/kaffe-gc/gc-refs.c
diff -u kaffe/kaffe/kaffevm/kaffe-gc/gc-refs.c:1.9 
kaffe/kaffe/kaffevm/kaffe-gc/gc-refs.c:1.10
--- kaffe/kaffe/kaffevm/kaffe-gc/gc-refs.c:1.9  Sat Dec 25 19:09:16 2004
+++ kaffe/kaffe/kaffevm/kaffe-gc/gc-refs.c      Wed Dec 29 16:27:42 2004
@@ -297,7 +297,7 @@
   * registered.  Terminating a thread will remove it from the
   * threading system, and then we won't walk it here anymore
   */
- KTHREAD(walkLiveThreads)(liveThreadWalker, collector);
+ KTHREAD(walkLiveThreads_r)(liveThreadWalker, collector);
  DBG(GCWALK,
      dprintf("Following references now...\n");
      );
Index: kaffe/kaffe/kaffevm/systems/unix-jthreads/jsignal.h
diff -u kaffe/kaffe/kaffevm/systems/unix-jthreads/jsignal.h:1.5 
kaffe/kaffe/kaffevm/systems/unix-jthreads/jsignal.h:1.6
--- kaffe/kaffe/kaffevm/systems/unix-jthreads/jsignal.h:1.5     Sun May  9 
14:20:12 2004
+++ kaffe/kaffe/kaffevm/systems/unix-jthreads/jsignal.h Wed Dec 29 16:27:42 2004
@@ -39,7 +39,6 @@
 
 void registerTerminalSignal(int sig, void* handler);
 
-void ignoreSignal(int sig);
 void clearSignal(int sig);
 void unblockSignal(int sig);
 void unblockAsyncSignals(void);
Index: kaffe/kaffe/kaffevm/systems/unix-pthreads/jsignal.h
diff -u kaffe/kaffe/kaffevm/systems/unix-pthreads/jsignal.h:1.4 
kaffe/kaffe/kaffevm/systems/unix-pthreads/jsignal.h:1.5
--- kaffe/kaffe/kaffevm/systems/unix-pthreads/jsignal.h:1.4     Wed Dec 29 
11:28:33 2004
+++ kaffe/kaffe/kaffevm/systems/unix-pthreads/jsignal.h Wed Dec 29 16:27:43 2004
@@ -37,10 +37,11 @@
 
 void registerTerminalSignal(int sig, void* handler);
 
-void clearSignal(int sig);
 void unblockSignal(int sig);
+void clearSignal(int sig);
 void unblockAsyncSignals(void);
 void blockAsyncSignals(void);
+void unblockAndCheckSignal(int sig);
 
 void detectStackBoundaries(jthread_t jtid, int mainThreadStackSize);
 
Index: kaffe/kaffe/kaffevm/systems/unix-pthreads/signal.c
diff -u kaffe/kaffe/kaffevm/systems/unix-pthreads/signal.c:1.16 
kaffe/kaffe/kaffevm/systems/unix-pthreads/signal.c:1.17
--- kaffe/kaffe/kaffevm/systems/unix-pthreads/signal.c:1.16     Wed Dec 29 
11:28:33 2004
+++ kaffe/kaffe/kaffevm/systems/unix-pthreads/signal.c  Wed Dec 29 16:27:43 2004
@@ -311,7 +311,6 @@
        sigprocmask(SIG_UNBLOCK, &nsig, NULL);
 }
 
-
 /*
  * Unblock all of the async signals.  (These are the
  * signals specified in the sa_mask in registerAsynchSignalHandler().)
Index: kaffe/kaffe/kaffevm/systems/unix-pthreads/syscalls.c
diff -u kaffe/kaffe/kaffevm/systems/unix-pthreads/syscalls.c:1.25 
kaffe/kaffe/kaffevm/systems/unix-pthreads/syscalls.c:1.26
--- kaffe/kaffe/kaffevm/systems/unix-pthreads/syscalls.c:1.25   Sun Dec 26 
05:52:33 2004
+++ kaffe/kaffe/kaffevm/systems/unix-pthreads/syscalls.c        Wed Dec 29 
16:27:43 2004
@@ -663,7 +663,7 @@
 
        int fds[8];
        int nfd;                /* number of fds in `fds' that are valid */
-       sigset_t nsig;
+       sigset_t nsig, osig;
        char b[1];
        int pid, i, err;
 
@@ -696,7 +696,7 @@
         * reenable signals in the child after we cleaned up.
         */
        sigfillset(&nsig);
-       sigprocmask(SIG_BLOCK, &nsig, NULL);
+       sigprocmask(SIG_BLOCK, &nsig, &osig);
 
        pid = fork();
 
@@ -752,7 +752,7 @@
                err = errno;
                /* Close all pipe fds */
                close_fds(fds, 8);
-               sigprocmask(SIG_UNBLOCK, &nsig, NULL);
+               sigprocmask(SIG_UNBLOCK, &osig, NULL);
                return (err);
 
        default:
@@ -769,7 +769,7 @@
                ioes[2] = fds[ERR_IN];
                ioes[3] = fds[SYNC_OUT];
 
-               sigprocmask(SIG_UNBLOCK, &nsig, NULL);
+               sigprocmask(SIG_UNBLOCK, &osig, NULL);
                *outpid = pid;
                return (0);
        }
Index: kaffe/kaffe/kaffevm/systems/unix-pthreads/thread-impl.c
diff -u kaffe/kaffe/kaffevm/systems/unix-pthreads/thread-impl.c:1.63 
kaffe/kaffe/kaffevm/systems/unix-pthreads/thread-impl.c:1.64
--- kaffe/kaffe/kaffevm/systems/unix-pthreads/thread-impl.c:1.63        Sat Dec 
25 19:09:17 2004
+++ kaffe/kaffe/kaffevm/systems/unix-pthreads/thread-impl.c     Wed Dec 29 
16:27:43 2004
@@ -915,7 +915,6 @@
         * the newly created thread is set up correctly (i.e. is walkable)
         */
        protectThreadList(cur);
-
        nt->active = 1;
        nt->next = activeThreads;
        activeThreads = nt;
@@ -945,15 +944,17 @@
          }
 
          repsem_destroy( &nt->sem);
-         unprotectThreadList(cur);
          KGC_rmRef(threadCollector, nt);
+         nt->active = 0;
+         activeThreads = nt->next;
+         unprotectThreadList(cur);
          return NULL;
        }
-
        /* wait until the thread specific data has been set, and the new thread
         * is in a suspendable state */
        repsem_wait( &nt->sem);
 
+       /* The key is installed. We can now let the signals coming. */
        unprotectThreadList(cur);
   }
   return (nt);
@@ -1260,6 +1261,12 @@
   if ( ++critSection == 1 ){
 
 #if !defined(KAFFE_BOEHM_GC)
+       int val;
+       int numPending = 0;
+
+       repsem_getvalue(&critSem, &val);
+       assert(val == 0);
+
        for ( t=activeThreads; t; t = t->next ){
          /*
           * make sure we don't suspend ourselves, and we don't expect suspend
@@ -1284,7 +1291,8 @@
                  {
                    if ((status = pthread_kill( t->tid, sigSuspend)) != 0)
                      {
-                       DBG( JTHREAD, dprintf("error sending SUSPEND signal to 
%p: %d\n", t, status));
+                       dprintf("Internal error: error sending SUSPEND signal 
to %p: %d (%s)\n", t, status, strerror(status));
+                       ABORT();
                      }
                    else
                      {
@@ -1292,13 +1300,32 @@
                         * It shouldn't be necessary (posix sems are 
accumulative), and it
                         * is bad, performancewise (at least n*2 context 
switches per suspend)
                         * but it works more reliably on linux 2.2.x */
-                       repsem_wait( &critSem);
+                       numPending++;
                      }
                  }
          }
          pthread_mutex_unlock(&t->suspendLock);
        }
 
+       /* Now that all signals has been sent we may wait for all concerned
+        * threads to handle them.
+        */
+       while (numPending > 0)
+         {
+           repsem_getvalue(&critSem, &val);
+           repsem_wait( &critSem);
+           for ( numPending=0,t=activeThreads; t; t = t->next ){
+             if (t->suspendState == SS_PENDING_SUSPEND)
+               numPending++;
+           }
+         }
+       /* Now flush the semaphore. */
+       repsem_getvalue(&critSem, &val);
+       for (;val != 0; val--)
+         {
+           repsem_wait(&critSem);
+         }
+
 #else
        /*
         * Here, we must use the special Boehm's stop world routine.
@@ -1339,6 +1366,7 @@
         * we cannot use mutexes as they cause a deadlock when the world
         * is suspended.
         */
+         protectThreadList(cur);
 
 #if !defined(KAFFE_BOEHM_GC)
        for ( t=activeThreads; t; t = t->next ){
@@ -1380,6 +1408,7 @@
        GC_start_world();
 
 #endif
+         unprotectThreadList(cur);
 
   }
 

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

Reply via email to