PatchSet 5528 
Date: 2005/03/12 21:22:38
Author: guilhem
Branch: HEAD
Tag: (none) 
Log:
Lock speedup + DestroyJavaVM fix.

        * kaffe/kaffevm/locks.c
        (getHeavyLock): Changed order of heavy locking.
        (putHeavyLock): Only call KSEM(put) if it is useful.

        * kaffe/kaffevm/systems/unix-pthreads/thread-impl.c
        (jthread_exit): If it is called from the main thread it will wait
        for all other non-daemon threads to exit before returning.

        * kaffe/kaffevm/jni/jni-base.c
        (KaffeJNI_DestroyJavaVM): New function.
        (JNI_CreateJavaVM): Remember the thread which has built the VM object.
        (startingThread): New variable.

        * kaffe/kaffevm/jni/jni_funcs.h
        (KaffeJNI_DestroyJavaVM): New function.

        * kaffe/kaffevm/jni/jni.c
        (Kaffe_DestroyJavaVM): Removed.

Members: 
        ChangeLog:1.3702->1.3703 
        kaffe/kaffevm/locks.c:1.57->1.58 
        kaffe/kaffevm/jni/jni-base.c:1.14->1.15 
        kaffe/kaffevm/jni/jni.c:1.18->1.19 
        kaffe/kaffevm/jni/jni_funcs.h:1.5->1.6 
        kaffe/kaffevm/systems/unix-pthreads/thread-impl.c:1.73->1.74 

Index: kaffe/ChangeLog
diff -u kaffe/ChangeLog:1.3702 kaffe/ChangeLog:1.3703
--- kaffe/ChangeLog:1.3702      Sat Mar 12 19:25:49 2005
+++ kaffe/ChangeLog     Sat Mar 12 21:22:38 2005
@@ -1,5 +1,26 @@
 2005-03-12  Guilhem Lavaux  <[EMAIL PROTECTED]>
 
+       * kaffe/kaffevm/locks.c
+       (getHeavyLock): Changed order of heavy locking.
+       (putHeavyLock): Only call KSEM(put) if it is useful.
+
+       * kaffe/kaffevm/systems/unix-pthreads/thread-impl.c
+       (jthread_exit): If it is called from the main thread it will wait
+       for all other non-daemon threads to exit before returning.
+
+       * kaffe/kaffevm/jni/jni-base.c
+       (KaffeJNI_DestroyJavaVM): New function.
+       (JNI_CreateJavaVM): Remember the thread which has built the VM object.
+       (startingThread): New variable.
+
+       * kaffe/kaffevm/jni/jni_funcs.h
+       (KaffeJNI_DestroyJavaVM): New function.
+
+       * kaffe/kaffevm/jni/jni.c
+       (Kaffe_DestroyJavaVM): Removed.
+       
+2005-03-12  Guilhem Lavaux  <[EMAIL PROTECTED]>
+
        * kaffe/kaffevm/systems/unix-jthreads/config-jthreads.h: Define
        SIGALTSTACK_NEEDS_END if the system is IRIX.
 
Index: kaffe/kaffe/kaffevm/locks.c
diff -u kaffe/kaffe/kaffevm/locks.c:1.57 kaffe/kaffe/kaffevm/locks.c:1.58
--- kaffe/kaffe/kaffevm/locks.c:1.57    Fri Mar 11 16:41:52 2005
+++ kaffe/kaffe/kaffevm/locks.c Sat Mar 12 21:22:40 2005
@@ -156,13 +156,14 @@
   /* The lock is allocated and ready to use. */
   for (;;) {
     /* Try to acquire the lock. */
+    lk->num_wait++;
     if (!COMPARE_AND_EXCHANGE(&(lk->in_progress), 0, 1))
       {
-       lk->num_wait++;
        KSEM(get)(&lk->sem, (jlong)0);
-       lk->num_wait--;
+        lk->num_wait--;
        continue;
       }
+    lk->num_wait--;
     lk->lkp = lkp;
     return lk;
   }
@@ -205,7 +206,8 @@
   
   lk->in_progress = 0;
   lk->lkp = NULL;
-  KSEM(put)(&(lk->sem));
+  if (lk->num_wait != 0)
+    KSEM(put)(&(lk->sem));
 }
 
 /*
@@ -223,6 +225,7 @@
     dprintf("slowLockMutex(lk=%p, th=%p)\n",
            *lkp, KTHREAD(current)());
     );
+
  KTHREAD(disable_stop)(); /* protect the heavy lock, and its queues */
 
  tdata = KTHREAD(get_data)(cur);
Index: kaffe/kaffe/kaffevm/jni/jni-base.c
diff -u kaffe/kaffe/kaffevm/jni/jni-base.c:1.14 
kaffe/kaffe/kaffevm/jni/jni-base.c:1.15
--- kaffe/kaffe/kaffevm/jni/jni-base.c:1.14     Sun Feb  6 14:57:50 2005
+++ kaffe/kaffe/kaffevm/jni/jni-base.c  Sat Mar 12 21:22:40 2005
@@ -32,6 +32,7 @@
  * we only support one at a time.
  */
 static int Kaffe_NumVM = 0;
+static jthread_t startingThread;
 
 extern struct JNINativeInterface Kaffe_JNINativeInterface;
 extern KaffeVM_Arguments Kaffe_JavaVMInitArgs;
@@ -303,6 +304,7 @@
   /* Return the VM and JNI we're using */
   *vm = &Kaffe_JavaVM;
   *env = THREAD_JNIENV();
+  startingThread = KTHREAD(current)();
   Kaffe_NumVM++;
 
 #if defined(ENABLE_JVMPI)
@@ -314,7 +316,20 @@
       jvmpiPostEvent(&ev);
     }
 #endif
-       
+
+  return 0;
+}
+
+jint
+KaffeJNI_DestroyJavaVM(JavaVM* vm UNUSED)
+{
+  /* The destroy function must be called by the same thread that has
+   * built the VM object
+   */
+  if (KTHREAD(current)() != startingThread)
+    return -1;
+
+  exitThread();
   return 0;
 }
 
Index: kaffe/kaffe/kaffevm/jni/jni.c
diff -u kaffe/kaffe/kaffevm/jni/jni.c:1.18 kaffe/kaffe/kaffevm/jni/jni.c:1.19
--- kaffe/kaffe/kaffevm/jni/jni.c:1.18  Sat Feb  5 17:12:07 2005
+++ kaffe/kaffe/kaffevm/jni/jni.c       Sat Mar 12 21:22:40 2005
@@ -736,14 +736,6 @@
 }
 
 static jint
-Kaffe_DestroyJavaVM(JavaVM* vm UNUSED)
-{
-       /* Right now, calling this from main2 is what prevents us from 
-          exiting there */
-       exitThread();
-}
-
-static jint
 Kaffe_AttachCurrentThread(JavaVM* vm UNUSED, void** penv, void* args UNUSED)
 {
        if (KTHREAD(attach_current_thread) (false)) {
@@ -1068,7 +1060,7 @@
        NULL,
        NULL,
        NULL,
-       Kaffe_DestroyJavaVM,
+       KaffeJNI_DestroyJavaVM,
        Kaffe_AttachCurrentThread,
        Kaffe_DetachCurrentThread,
        Kaffe_GetEnv,
Index: kaffe/kaffe/kaffevm/jni/jni_funcs.h
diff -u kaffe/kaffe/kaffevm/jni/jni_funcs.h:1.5 
kaffe/kaffe/kaffevm/jni/jni_funcs.h:1.6
--- kaffe/kaffe/kaffevm/jni/jni_funcs.h:1.5     Tue Dec 21 08:06:38 2004
+++ kaffe/kaffe/kaffevm/jni/jni_funcs.h Sat Mar 12 21:22:40 2005
@@ -12,6 +12,10 @@
 #ifndef KAFFE_JNI_FUNCTIONS_H
 #define KAFFE_JNI_FUNCTIONS_H
 
+/* ====== Invokation API 
============================================================= */
+
+jint KaffeJNI_DestroyJavaVM(JavaVM* vm);
+
 /* ====== Helpers 
=================================================================== */
 
 jmethodID KaffeJNI_FromReflectedMethod (JNIEnv *, jobject);
Index: kaffe/kaffe/kaffevm/systems/unix-pthreads/thread-impl.c
diff -u kaffe/kaffe/kaffevm/systems/unix-pthreads/thread-impl.c:1.73 
kaffe/kaffe/kaffevm/systems/unix-pthreads/thread-impl.c:1.74
--- kaffe/kaffe/kaffevm/systems/unix-pthreads/thread-impl.c:1.73        Sun Feb 
20 00:55:48 2005
+++ kaffe/kaffe/kaffevm/systems/unix-pthreads/thread-impl.c     Sat Mar 12 
21:22:41 2005
@@ -1004,9 +1004,10 @@
    */
 }
 
-/*
+/**
  * Function to be called (by threads.c firstStartThread) when the thread leaves
- * the user thread function
+ * the user thread function. If the calling thread is the main thread then it
+ * suspend the thread until all other threads has exited.
  */
 void
 jthread_exit ( void )
@@ -1044,7 +1045,9 @@
          }
 
          for ( t=activeThreads; t != NULL; t = t->next ){
-               if ( t != cur ) {
+               /* We must not kill the current thread and the main thread
+                */
+               if ( t != cur && t != firstThread) {
                  /* Mark the thread as to be killed. */
                  t->status = THREAD_KILL;
                  /* Send an interrupt event to the remote thread.
@@ -1066,27 +1069,32 @@
 #endif
 
          if ( (cur != firstThread) && (firstThread->active == 0) ) {
-               /* if the firstThread has already been frozen, it's not in the 
cache list */
-               pthread_cancel( firstThread->tid);
+               /* if the firstThread has already been frozen,
+                * it's not in the cache list. We must wake it up because
+                * this thread is the last one alive and it is exiting. */
                repsem_post (&firstThread->sem);
          }
 
-         unprotectThreadList(cur);
-         pthread_exit( NULL);
+         /* This is not the main thread so we may kill it. */
+         if (cur != firstThread)
+         {
+           unprotectThreadList(cur);
+           pthread_exit( NULL);
 
-         /* we shouldn't get here, this is a last safeguard */
-         EXIT(0);
+           /* we shouldn't get here, this is a last safeguard */
+           EXIT(0);
+         }
        }
        unprotectThreadList(cur);
   }
 
-  if ( cur == firstThread ) {
-       /*
-        * We don't cache this one, but we have to remove it from the active 
list. Note
-        * that the firstThread always has to be the last entry in the 
activeThreads list
-        * (we just add new entries at the head)
-        */
-       protectThreadList(cur);
+  /*
+   * We don't cache this one, but we have to remove it from the active list. 
Note
+   * that the firstThread always has to be the last entry in the activeThreads 
list
+   * (we just add new entries at the head)
+   */
+  protectThreadList(cur);
+  if ( cur == firstThread && nonDaemons != 0) {
 
        /* if we would be the head, we would have been the last, too (and 
already exited) */
        assert( cur != activeThreads);
@@ -1097,22 +1105,15 @@
 
        unprotectThreadList(cur);
 
-       /*
-        * Put us into a permanent freeze to avoid shut down of the whole 
process (it's
-        * not clear if this is common pthread behavior or just a implementation
-        * linux-threads "feature")
+       /* Put the main thread in a frozen state waiting for the other
+        * real threads to terminate. The main thread gets the control back
+        * after that.
         */
        repsem_wait( &cur->sem);
-
-       /* We put here a safe-guard in case the pthread_cancel has not managed
-        * to do its job and that repsem_wait awakes.
-        */
-       pthread_exit(NULL);
   }
-  else {
+  else if (cur != firstThread) {
        /* flag that we soon will get a new cache entry (would be annoying to
         * create a new thread in the meantime) */
-       protectThreadList(cur);
        pendingExits++;
        unprotectThreadList(cur);
   }

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

Reply via email to