[vmkit-commits] [vmkit] r60762 - in /vmkit/trunk: include/mvm/Threads/Locks.h include/mvm/Threads/Thread.h lib/JnJVM/Classpath/ClasspathReflect.h lib/JnJVM/VMCore/Jnjvm.cpp lib/Mvm/CommonThread/ctthread.cpp

Nicolas Geoffray nicolas.geoffray at lip6.fr
Tue Dec 9 05:55:43 PST 2008


Author: geoffray
Date: Tue Dec  9 07:55:36 2008
New Revision: 60762

URL: http://llvm.org/viewvc/llvm-project?rev=60762&view=rev
Log:
Implement thread termination by relying on the GC to run 
the thread destructor.


Modified:
    vmkit/trunk/include/mvm/Threads/Locks.h
    vmkit/trunk/include/mvm/Threads/Thread.h
    vmkit/trunk/lib/JnJVM/Classpath/ClasspathReflect.h
    vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp
    vmkit/trunk/lib/Mvm/CommonThread/ctthread.cpp

Modified: vmkit/trunk/include/mvm/Threads/Locks.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/include/mvm/Threads/Locks.h?rev=60762&r1=60761&r2=60762&view=diff

==============================================================================
--- vmkit/trunk/include/mvm/Threads/Locks.h (original)
+++ vmkit/trunk/include/mvm/Threads/Locks.h Tue Dec  9 07:55:36 2008
@@ -133,7 +133,7 @@
       lock |= 1;
     } else if ((lock & ThinMask) == id) {
       if ((lock & ThinCountMask) == ThinCountMask) {
-        overflowThinLock();
+        overflowThinLock(O);
       } else {
         ++lock;
       }

Modified: vmkit/trunk/include/mvm/Threads/Thread.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/include/mvm/Threads/Thread.h?rev=60762&r1=60761&r2=60762&view=diff

==============================================================================
--- vmkit/trunk/include/mvm/Threads/Thread.h (original)
+++ vmkit/trunk/include/mvm/Threads/Thread.h Tue Dec  9 07:55:36 2008
@@ -135,6 +135,8 @@
   static const uint64_t IDMask = 0x7FF00000;
 
   void* operator new(size_t sz);
+  
+  void operator delete(void* obj);
 
   void (*routine)(mvm::Thread*);
  

Modified: vmkit/trunk/lib/JnJVM/Classpath/ClasspathReflect.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/Classpath/ClasspathReflect.h?rev=60762&r1=60761&r2=60762&view=diff

==============================================================================
--- vmkit/trunk/lib/JnJVM/Classpath/ClasspathReflect.h (original)
+++ vmkit/trunk/lib/JnJVM/Classpath/ClasspathReflect.h Tue Dec  9 07:55:36 2008
@@ -93,6 +93,20 @@
 
 };
 
+class JavaObjectVMThread : public JavaObject {
+private:
+  JavaObject* thread;
+  bool running;
+  JavaObject* vmdata;
+
+public:
+  static void staticDestructor(JavaObjectVMThread* obj) {
+    mvm::Thread* th = (mvm::Thread*)obj->vmdata;
+    delete th;
+  }
+
+};
+
 }
 
 #endif

Modified: vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp?rev=60762&r1=60761&r2=60762&view=diff

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp Tue Dec  9 07:55:36 2008
@@ -780,6 +780,10 @@
   ptr = ((uintptr_t*)upcalls->newField->getVirtualVT());
   ptr[VT_TRACER_OFFSET] = (uintptr_t)JavaObjectField::staticTracer;
   
+  LOAD_CLASS(upcalls->newVMThread);
+  ptr = ((uintptr_t*)upcalls->newVMThread->getVirtualVT());
+  ptr[VT_DESTRUCTOR_OFFSET] = (uintptr_t)JavaObjectVMThread::staticDestructor;
+  
   LOAD_CLASS(upcalls->newStackTraceElement);
   LOAD_CLASS(upcalls->newVMThrowable);
   LOAD_CLASS(upcalls->boolClass);

Modified: vmkit/trunk/lib/Mvm/CommonThread/ctthread.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/Mvm/CommonThread/ctthread.cpp?rev=60762&r1=60761&r2=60762&view=diff

==============================================================================
--- vmkit/trunk/lib/Mvm/CommonThread/ctthread.cpp (original)
+++ vmkit/trunk/lib/Mvm/CommonThread/ctthread.cpp Tue Dec  9 07:55:36 2008
@@ -8,6 +8,8 @@
 //===----------------------------------------------------------------------===//
 
 #include "mvm/VirtualMachine.h"
+#include "mvm/Threads/Cond.h"
+#include "mvm/Threads/Locks.h"
 #include "mvm/Threads/Thread.h"
 
 #include <csignal>
@@ -65,7 +67,7 @@
   uintptr_t baseAddr;
   uint32 allocPtr;
   uint32 used[NR_THREADS];
-  LockNormal lock;
+  LockNormal stackLock;
 
   StackThreadManager() {
     baseAddr = 0;
@@ -103,19 +105,21 @@
   }
 
   uintptr_t allocate() {
+    stackLock.lock();
     uint32 start = allocPtr;
-    bool found = false;
-    uint32 myAllocPtr = allocPtr;
+    uint32 myIndex = 0;
     do {
-      found = __sync_bool_compare_and_swap_32(&used[myAllocPtr], 0, 1);
-      myAllocPtr++;
-      if (myAllocPtr == NR_THREADS) myAllocPtr = 0;
-    } while (myAllocPtr != start && !found);
+      if (!used[allocPtr]) {
+        used[allocPtr] = 1;
+        myIndex = allocPtr;
+      }
+      if (++allocPtr == NR_THREADS) allocPtr = 0;
+    } while (!myIndex && allocPtr != start);
+  
+    stackLock.unlock();
     
-    if (found) {
-      allocPtr = myAllocPtr;
-      return baseAddr + (myAllocPtr - 1) * STACK_SIZE;
-    }
+    if (myIndex)
+      return baseAddr + myIndex * STACK_SIZE;
 
     return 0;
   }
@@ -127,6 +131,7 @@
 /// machine specific.
 StackThreadManager TheStackManager;
 
+
 /// internalThreadStart - The initial function called by a thread. Sets some
 /// thread specific data, registers the thread to the GC and calls the
 /// given routine of th.
@@ -164,5 +169,20 @@
 /// Thread objects can not exceed a page.
 void* Thread::operator new(size_t sz) {
   assert(sz < (size_t)getpagesize() && "Thread local data too big");
-  return (void*)TheStackManager.allocate();
+  void* res = (void*)TheStackManager.allocate();
+  // Give it a second chance.
+  if (!res) {
+    Collector::collect();
+    res = (void*)TheStackManager.allocate();
+  }
+  return res;
+}
+
+/// operator delete - Remove the stack of the thread from the list of stacks
+/// in use.
+void Thread::operator delete(void* th) {
+  Thread* Th = (Thread*)th;
+  uintptr_t index = ((uintptr_t)Th->baseSP & Thread::IDMask);
+  index = (index & ~TheStackManager.baseAddr) >> 20;
+  TheStackManager.used[index] = 0;
 }





More information about the vmkit-commits mailing list