[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