[vmkit-commits] [vmkit] r180535 - Adding Thread.getState to OpenJDK

Peter Senna Tschudin peter.senna at gmail.com
Thu Apr 25 10:22:38 PDT 2013


Author: peter.senna
Date: Thu Apr 25 12:21:08 2013
New Revision: 180535

URL: http://llvm.org/viewvc/llvm-project?rev=180535&view=rev
Log:
Adding Thread.getState to OpenJDK
(cherry picked from commit 11a72996077e0409c2512284e8e63f0f48521dca)

Modified:
    vmkit/trunk/lib/j3/ClassLib/OpenJDK/OpenJDK.inc

Modified: vmkit/trunk/lib/j3/ClassLib/OpenJDK/OpenJDK.inc
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/j3/ClassLib/OpenJDK/OpenJDK.inc?rev=180535&r1=180534&r2=180535&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/ClassLib/OpenJDK/OpenJDK.inc (original)
+++ vmkit/trunk/lib/j3/ClassLib/OpenJDK/OpenJDK.inc Thu Apr 25 12:21:08 2013
@@ -187,6 +187,7 @@ JVM_InternString(JNIEnv *env, jstring _s
   BEGIN_JNI_EXCEPTION
 
   Jnjvm* vm = JavaThread::get()->getJVM();
+  //vmkit::Collector::collect();
   array = JavaString::strToArray(str, vm);
   res = vm->constructString(array);
 
@@ -2588,16 +2589,14 @@ JNIEXPORT jint JNICALL
 JVM_Read(jint fd, char *buf, jint nbytes) {
   BEGIN_JNI_EXCEPTION
   vmkit::Thread* th = vmkit::Thread::get();
-  assert(th && "Thread was not found");
-  //void* ptr = __builtin_frame_address(0);
   jint res = 0;
-  if (fd)
+  //if (fd)
+  //	res = read(fd, buf, nbytes);
+  //else {
+  	th->enterUncooperativeCode();
   	res = read(fd, buf, nbytes);
-  else {
-  	//th->enterUncooperativeCode((uint16_t)2);
-  	res = read(fd, buf, nbytes);
-  	//th->leaveUncooperativeCode();
-  }
+  	th->leaveUncooperativeCode();
+  //}
   RETURN_FROM_JNI(res);
   END_JNI_EXCEPTION
   return -1;
@@ -2764,13 +2763,27 @@ JVM_Bind(jint fd, struct sockaddr *him,
 
 JNIEXPORT jint JNICALL
 JVM_Accept(jint fd, struct sockaddr *him, jint *len) {
-  return accept(fd, him, (socklen_t*)len);
+	BEGIN_JNI_EXCEPTION
+	vmkit::Thread* th = vmkit::Thread::get();
+  	th->enterUncooperativeCode();
+  	jint res = accept(fd, him, (socklen_t*)len);
+  	th->leaveUncooperativeCode();
+	RETURN_FROM_JNI(res);
+	END_JNI_EXCEPTION
+	return -1;
 }
 
 JNIEXPORT jint JNICALL
 JVM_RecvFrom(jint fd, char *buf, int nBytes,
                   int flags, struct sockaddr *from, int *fromlen) {
-  return recvfrom(fd, buf, nBytes, flags, from, (socklen_t*)fromlen);
+    BEGIN_JNI_EXCEPTION
+	vmkit::Thread* th = vmkit::Thread::get();
+  	th->enterUncooperativeCode();
+  	jint res = recvfrom(fd, buf, nBytes, flags, from, (socklen_t*)fromlen);
+  	th->leaveUncooperativeCode();
+	RETURN_FROM_JNI(res);
+	END_JNI_EXCEPTION
+	return -1;
 }
 
 JNIEXPORT jint JNICALL
@@ -2985,7 +2998,59 @@ JVM_GetEnclosingMethodInfo(JNIEnv* env,
  */
 JNIEXPORT jintArray JNICALL
 JVM_GetThreadStateValues(JNIEnv* env, jint javaThreadState) {
-  NYI();
+	ArraySInt32* res = 0;
+	jintArray result = 0;
+	llvm_gcroot(res, 0);
+	llvm_gcroot(result, 0);
+	
+	BEGIN_JNI_EXCEPTION
+  	/* If new thread states are added in future JDK and VM versions,
+	   this should check if the JDK version is compatible with thread
+	   states supported by the VM.  Return NULL if not compatible.
+	
+	   This function must map the VM java_lang_Thread::ThreadStatus
+	   to the Java thread state that the JDK supports. */
+	Jnjvm* vm = JavaThread::get()->getJVM();
+	Classpath* upcalls = vm->upcalls;
+	UserClassArray* array = upcalls->ArrayOfInt;
+
+	switch (javaThreadState) {
+    case vmkit::LockingThread::StateNew:
+    case vmkit::LockingThread::StateRunning:
+    case vmkit::LockingThread::StateBlocked:
+    case vmkit::LockingThread::StateTerminated:
+	{
+		res = (ArraySInt32*)array->doNew(1, vm);
+		result = (jintArray)res;
+		ArraySInt32::setElement(res, javaThreadState , 0);
+		break;
+	}
+
+    case vmkit::LockingThread::StateWaiting:
+	{
+		res = (ArraySInt32*)array->doNew(2, vm);
+		result = (jintArray)res;
+		ArraySInt32::setElement(res, vmkit::LockingThread::StateWaiting , 0);
+		ArraySInt32::setElement(res, vmkit::LockingThread::StateParked , 1);
+		break;
+	}
+
+    case vmkit::LockingThread::StateTimeWaiting:
+	{
+		res = (ArraySInt32*)array->doNew(2, vm);
+		result = (jintArray)res;
+		ArraySInt32::setElement(res, vmkit::LockingThread::StateTimeWaiting , 0);
+		ArraySInt32::setElement(res, vmkit::LockingThread::StateTimeParked , 1);
+		break;
+	}
+
+    default:
+		/* Unknown state - probably incompatible JDK version */
+		break;
+	}
+	RETURN_FROM_JNI(result);
+	END_JNI_EXCEPTION
+	return NULL;
 }
 
 /*
@@ -2998,7 +3063,94 @@ JVM_GetThreadStateValues(JNIEnv* env, ji
  */
 JNIEXPORT jobjectArray JNICALL
 JVM_GetThreadStateNames(JNIEnv* env, jint javaThreadState, jintArray values) {
-  NYI();
+	BEGIN_JNI_EXCEPTION
+	vmkit::Thread* th = vmkit::Thread::get();
+  	//th->enterUncooperativeCode();
+  	
+
+  ArrayObject* res = 0;
+jobjectArray result = 0;
+JavaObject* str = 0;
+llvm_gcroot(res, 0);
+llvm_gcroot(result, 0);
+llvm_gcroot(str, 0);
+llvm_gcroot(values, 0);
+
+Jnjvm* vm = JavaThread::get()->getJVM();
+Classpath* upcalls = vm->upcalls;
+UserClassArray* array = upcalls->ArrayOfString;
+
+JnjvmClassLoader* loader;
+
+  switch (javaThreadState) {
+    case vmkit::LockingThread::StateNew:
+		{
+			//assert(ia.get_length() == 1 && ia.get_element(0) == THREAD_STATE_NEW);
+
+			res = (ArrayObject*)array->doNew(1, vm);
+			result = (jobjectArray)res;
+			str = (vm->asciizToStr("NEW"));
+			ArrayObject::setElement(res, str, 0);
+			break;
+		}
+
+    case vmkit::LockingThread::StateRunning:
+		{
+			res = (ArrayObject*)array->doNew(1, vm);
+			result = (jobjectArray)res;
+			str = (vm->asciizToStr("RUNNABLE"));
+			ArrayObject::setElement(res, str, 0);
+			break;
+		}
+
+    case vmkit::LockingThread::StateBlocked:
+		{
+			res = (ArrayObject*)array->doNew(1, vm);
+			result = (jobjectArray)res;
+			str = (vm->asciizToStr("BLOCKED"));
+			ArrayObject::setElement(res, str, 0);
+			break;
+		}
+
+    case vmkit::LockingThread::StateWaiting:
+		{
+			res = (ArrayObject*)array->doNew(2, vm);
+			result = (jobjectArray)res;
+			str = (vm->asciizToStr("WAITING.OBJECT_WAIT"));
+			ArrayObject::setElement(res, str, 0);
+			str = (vm->asciizToStr("WAITING.PARKED"));
+			ArrayObject::setElement(res, str, 1);
+			break;
+		}
+
+    case vmkit::LockingThread::StateTimeWaiting:
+		{	
+			res = (ArrayObject*)array->doNew(2, vm);
+			result = (jobjectArray)res;
+			str = (vm->asciizToStr("TIMED_WAITING.OBJECT_WAIT"));
+			ArrayObject::setElement(res, str, 0);
+			str = (vm->asciizToStr("TIMED_WAITING.PARKED"));
+			ArrayObject::setElement(res, str, 1);
+			break;
+		}
+
+    case vmkit::LockingThread::StateTerminated:
+		{
+			res = (ArrayObject*)array->doNew(1, vm);
+			result = (jobjectArray)res;
+			str = (vm->asciizToStr("TERMINATED"));
+			ArrayObject::setElement(res, str, 0);
+			break;
+		}
+
+	default:
+		/* Unknown state - probably incompatible JDK version */
+		break;
+	}
+	//th->leaveUncooperativeCode();
+	RETURN_FROM_JNI(result);
+	END_JNI_EXCEPTION
+	return NULL;
 }
 
 JNIEXPORT void JNICALL





More information about the vmkit-commits mailing list