[vmkit-commits] [vmkit] r180482 - Implemening VMThread.getState
Peter Senna Tschudin
peter.senna at gmail.com
Thu Apr 25 10:16:47 PDT 2013
Author: peter.senna
Date: Thu Apr 25 12:15:12 2013
New Revision: 180482
URL: http://llvm.org/viewvc/llvm-project?rev=180482&view=rev
Log:
Implemening VMThread.getState
(cherry picked from commit f958865aff07fd62807e19362304ba6e5a839176)
Modified:
vmkit/trunk/include/vmkit/ObjectLocks.h
vmkit/trunk/lib/j3/ClassLib/GNUClasspath/ClasspathVMThread.inc
vmkit/trunk/lib/j3/Compiler/JavaJIT.cpp
vmkit/trunk/lib/j3/VMCore/JavaObject.cpp
vmkit/trunk/lib/vmkit/CommonThread/ObjectLocks.cpp
vmkit/trunk/lib/vmkit/CommonThread/ctthread.cpp
Modified: vmkit/trunk/include/vmkit/ObjectLocks.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/include/vmkit/ObjectLocks.h?rev=180482&r1=180481&r2=180482&view=diff
==============================================================================
--- vmkit/trunk/include/vmkit/ObjectLocks.h (original)
+++ vmkit/trunk/include/vmkit/ObjectLocks.h Thu Apr 25 12:15:12 2013
@@ -46,7 +46,9 @@ public:
static const unsigned int StateRunning = 0;
static const unsigned int StateWaiting = 1;
- static const unsigned int StateInterrupted = 2;
+ static const unsigned int StateTimeWaiting = 2;
+ static const unsigned int StateInterrupted = 3;
+ static const unsigned int StateBlocked = 4;
/// state - The current state of this thread: Running, Waiting or Interrupted.
uint32 state;
Modified: vmkit/trunk/lib/j3/ClassLib/GNUClasspath/ClasspathVMThread.inc
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/j3/ClassLib/GNUClasspath/ClasspathVMThread.inc?rev=180482&r1=180481&r2=180482&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/ClassLib/GNUClasspath/ClasspathVMThread.inc (original)
+++ vmkit/trunk/lib/j3/ClassLib/GNUClasspath/ClasspathVMThread.inc Thu Apr 25 12:15:12 2013
@@ -218,4 +218,48 @@ jclass clazz,
vmkit::Thread::yield();
}
+JNIEXPORT JavaObject* JNICALL Java_java_lang_VMThread_getState(
+#ifdef NATIVE_JNI
+JNIEnv *env,
+#endif
+JavaObject* vmthread) {
+ JavaString* obj = NULL;
+ llvm_gcroot(obj, 0);
+ llvm_gcroot(vmthread, 0);
+
+ BEGIN_NATIVE_EXCEPTION(0)
+
+ Jnjvm* vm = JavaThread::get()->getJVM();
+ JavaField* field = vm->upcalls->vmdataVMThread;
+
+ // It's possible that the thread to be interrupted has not finished
+ // its initialization. Wait until the initialization is done.
+ JavaThread* th = (JavaThread*)field->getInstanceObjectField(vmthread);
+ if (th == 0) {
+ obj = vm->asciizToStr("NEW");
+ return obj;
+ }
+ else {
+ switch (th->lockingThread.state) {
+ case vmkit::LockingThread::StateWaiting:
+ obj = vm->asciizToStr("WAITING");
+ return obj;
+ case vmkit::LockingThread::StateTimeWaiting:
+ obj = vm->asciizToStr("TIMED_WAITING");
+ return obj;
+ case vmkit::LockingThread::StateBlocked:
+ obj = vm->asciizToStr("BLOCKED");
+ return obj;
+ default:
+ obj = vm->asciizToStr("RUNNABLE");
+ return obj;
+ }
+ obj = vm->asciizToStr("TERMINATED");
+ return obj;
+ }
+
+ END_NATIVE_EXCEPTION
+}
+
+
}
Modified: vmkit/trunk/lib/j3/Compiler/JavaJIT.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/j3/Compiler/JavaJIT.cpp?rev=180482&r1=180481&r2=180482&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/Compiler/JavaJIT.cpp (original)
+++ vmkit/trunk/lib/j3/Compiler/JavaJIT.cpp Thu Apr 25 12:15:12 2013
@@ -686,7 +686,7 @@ void JavaJIT::monitorEnter(Value* obj) {
BranchInst::Create(OK, NotOK, cmp, currentBlock);
- // The atomic cas did not work.
+ // The atomic cast did not work.
currentBlock = NotOK;
CallInst::Create(intrinsics->AquireObjectFunction, obj, "", currentBlock);
BranchInst::Create(OK, currentBlock);
Modified: vmkit/trunk/lib/j3/VMCore/JavaObject.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/j3/VMCore/JavaObject.cpp?rev=180482&r1=180481&r2=180482&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/VMCore/JavaObject.cpp (original)
+++ vmkit/trunk/lib/j3/VMCore/JavaObject.cpp Thu Apr 25 12:15:12 2013
@@ -236,12 +236,15 @@ void JavaObject::overflowThinLock(JavaOb
void JavaObject::acquire(JavaObject* self) {
llvm_gcroot(self, 0);
+ JavaThread::get()->lockingThread.state = vmkit::LockingThread::StateBlocked;
vmkit::ThinLock::acquire(self, JavaThread::get()->getJVM()->lockSystem);
+ JavaThread::get()->lockingThread.state = vmkit::LockingThread::StateRunning;
}
void JavaObject::release(JavaObject* self) {
llvm_gcroot(self, 0);
vmkit::ThinLock::release(self, JavaThread::get()->getJVM()->lockSystem);
+ JavaThread::get()->lockingThread.state = vmkit::LockingThread::StateRunning;
}
bool JavaObject::owner(JavaObject* self) {
Modified: vmkit/trunk/lib/vmkit/CommonThread/ObjectLocks.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/vmkit/CommonThread/ObjectLocks.cpp?rev=180482&r1=180481&r2=180482&view=diff
==============================================================================
--- vmkit/trunk/lib/vmkit/CommonThread/ObjectLocks.cpp (original)
+++ vmkit/trunk/lib/vmkit/CommonThread/ObjectLocks.cpp Thu Apr 25 12:15:12 2013
@@ -154,7 +154,7 @@ void ThinLock::acquire(gc* object, LockS
if (obj->acquire(object, table)) {
assert((object->header() & FatMask) && "Inconsistent lock");
assert((table.getFatLockFromID(object->header()) == obj) && "Inconsistent lock");
- assert(owner(object, table) && "Not owner after acquring fat lock!");
+ assert(owner(object, table) && "Not owner after acquiring fat lock!");
break;
}
}
@@ -436,7 +436,8 @@ bool LockingThread::wait(
return true;
}
- this->state = LockingThread::StateWaiting;
+ this->state = (timed && (info->tv_sec > 0 || info->tv_usec>0))? LockingThread::StateTimeWaiting : LockingThread::StateWaiting;
+
if (l->firstThread) {
assert(l->firstThread->prevWaiting && l->firstThread->nextWaiting &&
"Inconsistent list");
Modified: vmkit/trunk/lib/vmkit/CommonThread/ctthread.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/vmkit/CommonThread/ctthread.cpp?rev=180482&r1=180481&r2=180482&view=diff
==============================================================================
--- vmkit/trunk/lib/vmkit/CommonThread/ctthread.cpp (original)
+++ vmkit/trunk/lib/vmkit/CommonThread/ctthread.cpp Thu Apr 25 12:15:12 2013
@@ -380,6 +380,7 @@ void* Thread::operator new(size_t sz) {
void* res = (void*)TheStackManager.allocate();
// Make sure the thread information is cleared.
if (res != NULL) memset(res, 0, sz);
+ assert(res && "Thread cannot be allocated because there is no room available");
return res;
}
More information about the vmkit-commits
mailing list