[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