[vmkit-commits] [vmkit] r180509 - Adding a different file for Unsafe in GNuClasspath

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


Author: peter.senna
Date: Thu Apr 25 12:17:47 2013
New Revision: 180509

URL: http://llvm.org/viewvc/llvm-project?rev=180509&view=rev
Log:
Adding a different file for Unsafe in GNuClasspath
(cherry picked from commit 5019278fba22b92b47524384fed4d9d04849e8d0)

Added:
    vmkit/trunk/lib/j3/ClassLib/GNUClasspath/GNuClasspathUnsafe.inc

Added: vmkit/trunk/lib/j3/ClassLib/GNUClasspath/GNuClasspathUnsafe.inc
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/j3/ClassLib/GNUClasspath/GNuClasspathUnsafe.inc?rev=180509&view=auto
==============================================================================
--- vmkit/trunk/lib/j3/ClassLib/GNUClasspath/GNuClasspathUnsafe.inc (added)
+++ vmkit/trunk/lib/j3/ClassLib/GNUClasspath/GNuClasspathUnsafe.inc Thu Apr 25 12:17:47 2013
@@ -0,0 +1,37 @@
+#include "VMStaticInstance.h"
+#include <stdlib.h>
+
+extern "C" {
+
+JNIEXPORT void JNICALL Java_sun_misc_Unsafe_unpark(
+JavaObject* unsafe, JavaObject* thread) {
+  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.
+  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 = (JavaThread*)field->getInstanceObjectField(vmthread);
+  while (th == 0) {
+  	JavaThread::yield();
+  	fprintf(stderr, "Case 1\n");
+  	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());
+}
+
+}
\ No newline at end of file





More information about the vmkit-commits mailing list