[vmkit-commits] [vmkit] r180506 - Implementing park/unpark OpenJDK

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


Author: peter.senna
Date: Thu Apr 25 12:17:33 2013
New Revision: 180506

URL: http://llvm.org/viewvc/llvm-project?rev=180506&view=rev
Log:
Implementing park/unpark OpenJDK
(cherry picked from commit f6dd8d62edd95c98b1ec422e2f27dea961054eef)

Modified:
    vmkit/trunk/lib/j3/ClassLib/GNUClasspath/JavaUpcalls.cpp
    vmkit/trunk/lib/j3/ClassLib/OpenJDK/OpenJDK.inc
    vmkit/trunk/lib/j3/ClassLib/Unsafe.inc

Modified: vmkit/trunk/lib/j3/ClassLib/GNUClasspath/JavaUpcalls.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/j3/ClassLib/GNUClasspath/JavaUpcalls.cpp?rev=180506&r1=180505&r2=180506&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/ClassLib/GNUClasspath/JavaUpcalls.cpp (original)
+++ vmkit/trunk/lib/j3/ClassLib/GNUClasspath/JavaUpcalls.cpp Thu Apr 25 12:17:33 2013
@@ -1169,3 +1169,4 @@ void Classpath::InitializeSystem(Jnjvm *
 #include "ClasspathVMThread.inc"
 #include "ClasspathVMThrowable.inc"
 #include "Unsafe.inc"
+#include "GNuClasspathUnsafe.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=180506&r1=180505&r2=180506&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/ClassLib/OpenJDK/OpenJDK.inc (original)
+++ vmkit/trunk/lib/j3/ClassLib/OpenJDK/OpenJDK.inc Thu Apr 25 12:17:33 2013
@@ -787,6 +787,7 @@ JVM_Interrupt(JNIEnv *env, jobject _thre
   JavaThread* jth = (JavaThread*)field->getInstanceLongField(thread);
   jth->lockingThread.interruptFlag = 1;
   vmkit::FatLock* lock = jth->lockingThread.waitsOn;
+  jth->parkLock.unpark();
 
   // If the thread is blocked on a wait. We also verify nextWaiting in case
   // the thread has been notified.
@@ -2992,5 +2993,4 @@ JNIEXPORT void JNICALL
 JVM_GetVersionInfo(JNIEnv* env, jvm_version_info* info, size_t info_size) {
   NYI();
 }
-
 // vim: set ft=cpp:

Modified: vmkit/trunk/lib/j3/ClassLib/Unsafe.inc
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/j3/ClassLib/Unsafe.inc?rev=180506&r1=180505&r2=180506&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/ClassLib/Unsafe.inc (original)
+++ vmkit/trunk/lib/j3/ClassLib/Unsafe.inc Thu Apr 25 12:17:33 2013
@@ -484,6 +484,7 @@ JavaObject* unsafe, jlong ptr, jlong val
 //===--- Park/Unpark thread support ---------------------------------------===//
 JNIEXPORT void JNICALL Java_sun_misc_Unsafe_park(
 JavaObject* unsafe, jboolean isAbsolute, jlong time) {
+	return;
   llvm_gcroot(unsafe, 0);
   JavaThread* thread = (JavaThread*)JavaThread::get();
   thread->parkLock.park(isAbsolute, time, thread);
@@ -491,31 +492,39 @@ JavaObject* unsafe, jboolean isAbsolute,
 
 JNIEXPORT void JNICALL Java_sun_misc_Unsafe_unpark(
 JavaObject* unsafe, JavaObject* thread) {
+	return;
   llvm_gcroot(unsafe, 0);
   llvm_gcroot(thread, 0);
-  JavaObject* vmthread;
-  llvm_gcroot(vmthread, 0);
   Jnjvm* vm = JavaThread::get()->getJVM();
-  JavaField* field = vm->upcalls->vmdataVMThread;
-  JavaField* field2 = vm->upcalls->vmThread; 
   
   // It's possible that the thread to be interrupted has not finished
   // its initialization. Wait until the initialization is done.
-  vmthread = field2->getInstanceObjectField(thread);
-  while (vmthread == 0) {
-  	JavaThread::yield();
-  	vmthread = field2->getInstanceObjectField(thread);
-  }
-  JavaThread* th = (JavaThread*)field->getInstanceObjectField(vmthread);
+  //fprintf(stderr, "Case -1\n");
+//  vmthread = field2->getInstanceObjectField(thread);
+//  while (vmthread == 0) {
+//  	JavaThread::yield();
+//  	fprintf(stderr, "Case 0\n");
+//  	vmthread = field2->getInstanceObjectField(thread);
+//  }
+  JavaThread* th = 0;
+  
+  // Get the eetop field
+  sint64 newTh = vm->upcalls->eetop->getInstanceLongField(thread);
+  th = (JavaThread*)newTh;
   while (th == 0) {
   	JavaThread::yield();
-  	th = (JavaThread*)field->getInstanceObjectField(vmthread);
+  	//fprintf(stderr, "Case 1\n");
+  	newTh = vm->upcalls->eetop->getInstanceLongField(thread);
+  	th = (JavaThread*)newTh;
+  	//th = (JavaThread*)field->getInstanceObjectField(vmthread);
   }
   //fprintf(stderr, "unparking started %lld\n", th->getThreadID());
   th->parkLock.unpark();
+  //fprintf(stderr, "Case 2\n");
   //fprintf(stderr, "unparking done %lld\n", th->getThreadID());
 }
 
+
 //===--- Monitor support --------------------------------------------------===//
 JNIEXPORT void JNICALL Java_sun_misc_Unsafe_tryMonitorEnter(
 JavaObject* unsafe, JavaObject * obj) {





More information about the vmkit-commits mailing list