Looks good!<br><br><div class="gmail_quote">On Thu, Oct 27, 2011 at 3:50 AM, Will Dietz <span dir="ltr"><<a href="mailto:wdietz2@illinois.edu">wdietz2@illinois.edu</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
Inlined below.<br>
<br>
~Will<br>
<br>
<br>
>From 181165b4d5032c347dd7d29ac79acbef2fea7c16 Mon Sep 17 00:00:00 2001<br>
From: Will Dietz <<a href="mailto:w@wdtz.org">w@wdtz.org</a>><br>
Date: Wed, 26 Oct 2011 20:47:40 -0500<br>
Subject: [PATCH] OpenJDK.inc: Implement misc simple-ish JVM_* methods<br>
<br>
---<br>
 lib/J3/ClassLib/OpenJDK/OpenJDK.inc |  157 +++++++++++++++++++++++++++++------<br>
 1 files changed, 132 insertions(+), 25 deletions(-)<br>
<br>
diff --git a/lib/J3/ClassLib/OpenJDK/OpenJDK.inc<br>
b/lib/J3/ClassLib/OpenJDK/OpenJDK.inc<br>
index ae64e32..e5690a5 100644<br>
--- a/lib/J3/ClassLib/OpenJDK/OpenJDK.inc<br>
+++ b/lib/J3/ClassLib/OpenJDK/OpenJDK.inc<br>
@@ -1,7 +1,18 @@<br>
 // vim: set ft=cpp:<br>
 // TODO: Add comment header like the rest of VMKit<br>
<br>
-#include <jvm.h><br>
+#include "jvm.h"<br>
+#include "Reader.h"<br>
+#include "JavaConstantPool.h"<br>
+#include "SetProperties.inc"<br>
+<br>
+#include <sys/time.h><br>
+#include <sys/types.h><br>
+#include <sys/stat.h><br>
+#include <fcntl.h><br>
+#include <signal.h><br>
+#include <errno.h><br>
+#include <sys/ioctl.h><br>
<br>
 #define NYI() \<br>
   do{ assert(0 && "Not yet implemented!"); abort(); } while(0)<br>
@@ -9,7 +20,7 @@<br>
<br>
 JNIEXPORT jint JNICALL<br>
 JVM_GetInterfaceVersion(void) {<br>
-  NYI();<br>
+  return JVM_INTERFACE_VERSION;<br>
 }<br>
<br>
 jint JVM_CreateJavaVM(JavaVM **pvm, void **penv, void *args) {<br>
@@ -18,22 +29,55 @@ jint JVM_CreateJavaVM(JavaVM **pvm, void **penv,<br>
void *args) {<br>
<br>
 JNIEXPORT jint JNICALL<br>
 JVM_IHashCode(JNIEnv *env, jobject _obj) {<br>
-  NYI();<br>
+  JavaObject * obj = *(JavaObject**)_obj;<br>
+  llvm_gcroot(obj, 0);<br>
+<br>
+  jint hash = (obj == NULL) ? 0 : JavaObject::hashCode(obj);<br>
+  return hash;<br>
 }<br>
<br>
 JNIEXPORT void JNICALL<br>
 JVM_MonitorWait(JNIEnv *env, jobject obj, jlong ms) {<br>
-  NYI();<br>
+  JavaObject * o = 0;<br>
+  llvm_gcroot(o, 0);<br>
+<br>
+  BEGIN_JNI_EXCEPTION<br>
+  Jnjvm* vm = JavaThread::get()->getJVM();<br>
+<br>
+  o = *(JavaObject**)obj;<br>
+<br>
+  if (ms < 0) {<br>
+    vm->illegalArgumentException("Negative wait time specified");<br>
+  }<br>
+  if (ms) {<br>
+    struct timeval info;<br>
+    uint64_t usec = ms * 1000LL;<br>
+    info.tv_usec = usec % 1000000LL;<br>
+    info.tv_sec = usec / 1000000LL;<br>
+    JavaObject::timedWait(o, info);<br>
+  } else {<br>
+    JavaObject::wait(o);<br>
+  }<br>
+  RETURN_VOID_FROM_JNI<br>
+  END_JNI_EXCEPTION<br>
 }<br>
<br>
 JNIEXPORT void JNICALL<br>
 JVM_MonitorNotify(JNIEnv *env, jobject obj) {<br>
-  NYI();<br>
+  BEGIN_JNI_EXCEPTION<br>
+  JavaObject * o = *(JavaObject**)obj;<br>
+  JavaObject::notify(o);<br>
+  RETURN_VOID_FROM_JNI<br>
+  END_JNI_EXCEPTION<br>
 }<br>
<br>
 JNIEXPORT void JNICALL<br>
 JVM_MonitorNotifyAll(JNIEnv *env, jobject obj) {<br>
-  NYI();<br>
+  BEGIN_JNI_EXCEPTION<br>
+  JavaObject * o = *(JavaObject**)obj;<br>
+  JavaObject::notifyAll(o);<br>
+  RETURN_VOID_FROM_JNI<br>
+  END_JNI_EXCEPTION<br>
 }<br>
<br>
 JNIEXPORT jobject JNICALL<br>
@@ -54,12 +98,22 @@ JVM_InternString(JNIEnv *env, jstring _str) {<br>
  */<br>
 JNIEXPORT jlong JNICALL<br>
 JVM_CurrentTimeMillis(JNIEnv *env, jclass ignored) {<br>
-  NYI();<br>
+  struct timeval tv;<br>
+  gettimeofday(&tv, NULL);<br>
+  jlong time = (tv.tv_sec * 1000LL) + (tv.tv_usec / 1000LL);<br>
+  return time;<br>
 }<br>
<br>
 JNIEXPORT jlong JNICALL<br>
 JVM_NanoTime(JNIEnv *env, jclass ignored) {<br>
-  NYI();<br>
+  // TODO: Impl with more accurate clock?<br>
+  struct timeval tv;<br>
+<br>
+  gettimeofday(&tv, NULL);<br>
+<br>
+  jlong time = (tv.tv_sec * 1000000LL) + (tv.tv_usec / 1000000LL);<br>
+<br>
+  return time;<br>
 }<br>
<br>
 JNIEXPORT void JNICALL<br>
@@ -70,7 +124,17 @@ JVM_ArrayCopy(JNIEnv *env, jclass ignored, jobject<br>
jsrc, jint sstart,<br>
<br>
 JNIEXPORT jobject JNICALL<br>
 JVM_InitProperties(JNIEnv *env, jobject p) {<br>
-  NYI();<br>
+  BEGIN_JNI_EXCEPTION<br>
+  JavaObject * prop = *(JavaObject**)p;<br>
+  llvm_gcroot(prop, 0);<br>
+  setProperties(prop);<br>
+  setCommandLineProperties(prop);<br>
+<br>
+  RETURN_FROM_JNI(p);<br>
+<br>
+  END_JNI_EXCEPTION<br>
+<br>
+  return 0;<br>
 }<br>
<br>
 /*<br>
@@ -86,17 +150,20 @@ JVM_OnExit(void (*func)(void)) {<br>
  */<br>
 JNIEXPORT void JNICALL<br>
 JVM_Exit(jint code) {<br>
-  NYI();<br>
+  mvm::System::Exit(code);<br>
 }<br>
<br>
 JNIEXPORT void JNICALL<br>
 JVM_Halt(jint code) {<br>
-  NYI();<br>
+  mvm::System::Exit(code);<br>
 }<br>
<br>
 JNIEXPORT void JNICALL<br>
 JVM_GC(void) {<br>
-  NYI();<br>
+  BEGIN_JNI_EXCEPTION<br>
+  mvm::Collector::collect();<br>
+  RETURN_VOID_FROM_JNI;<br>
+  END_JNI_EXCEPTION<br>
 }<br>
<br>
 /* Returns the number of real-time milliseconds that have elapsed since the<br>
@@ -130,27 +197,33 @@ JVM_TraceMethodCalls(jboolean on) {<br>
<br>
 JNIEXPORT jlong JNICALL<br>
 JVM_TotalMemory(void) {<br>
-  NYI();<br>
+  return (jlong)mvm::Collector::getTotalMemory();<br>
 }<br>
<br>
 JNIEXPORT jlong JNICALL<br>
 JVM_FreeMemory(void) {<br>
-  NYI();<br>
+  return (jlong)mvm::Collector::getFreeMemory();<br>
 }<br>
<br>
 JNIEXPORT jlong JNICALL<br>
 JVM_MaxMemory(void) {<br>
-  NYI();<br>
+  return (jlong)mvm::Collector::getMaxMemory();<br>
 }<br>
<br>
 JNIEXPORT jint JNICALL<br>
 JVM_ActiveProcessorCount(void) {<br>
-  NYI();<br>
+  return mvm::System::GetNumberOfProcessors();<br>
 }<br>
<br>
 JNIEXPORT void * JNICALL<br>
 JVM_LoadLibrary(const char *name) {<br>
-  NYI();<br>
+  BEGIN_JNI_EXCEPTION<br>
+  Jnjvm* vm = JavaThread::get()->getJVM();<br>
+  RETURN_FROM_JNI(vm->bootstrapLoader->loadLib(name));<br>
+<br>
+  END_JNI_EXCEPTION<br>
+<br>
+  return 0;<br>
 }<br>
<br>
 JNIEXPORT void JNICALL<br>
@@ -160,7 +233,14 @@ JVM_UnloadLibrary(void * handle) {<br>
<br>
 JNIEXPORT void * JNICALL<br>
 JVM_FindLibraryEntry(void *handle, const char *name) {<br>
-  NYI();<br>
+  BEGIN_JNI_EXCEPTION<br>
+  Jnjvm* vm = JavaThread::get()->getJVM();<br>
+  bool j3 = false;<br>
+  RETURN_FROM_JNI((void *)vm->bootstrapLoader->loadInLib(name, j3));<br>
+<br>
+  END_JNI_EXCEPTION<br>
+<br>
+  return 0;<br>
 }<br>
<br>
 JNIEXPORT jboolean JNICALL<br>
@@ -272,7 +352,7 @@ JVM_SetThreadPriority(JNIEnv *env, jobject thread,<br>
jint prio) {<br>
<br>
 JNIEXPORT void JNICALL<br>
 JVM_Yield(JNIEnv *env, jclass threadClass) {<br>
-  NYI();<br>
+  mvm::Thread::yield();<br>
 }<br>
<br>
 JNIEXPORT void JNICALL<br>
@@ -282,7 +362,12 @@ JVM_Sleep(JNIEnv *env, jclass threadClass, jlong millis) {<br>
<br>
 JNIEXPORT jobject JNICALL<br>
 JVM_CurrentThread(JNIEnv *env, jclass threadClass) {<br>
-  NYI();<br>
+  BEGIN_JNI_EXCEPTION<br>
+  JavaThread* th = JavaThread::get();<br>
+  RETURN_FROM_JNI((jobject)th->pushJNIRef(th->currentThread()));<br>
+  END_JNI_EXCEPTION<br>
+<br>
+  return 0;<br>
 }<br>
<br>
 JNIEXPORT jint JNICALL<br>
@@ -444,7 +529,19 @@ JVM_NewMultiArray(JNIEnv *env, jclass eltClass,<br>
jintArray dim) {<br>
  */<br>
 JNIEXPORT jclass JNICALL<br>
 JVM_GetCallerClass(JNIEnv *env, int n) {<br>
-  NYI();<br>
+  BEGIN_JNI_EXCEPTION<br>
+<br>
+  JavaThread* th = JavaThread::get();<br>
+<br>
+  Jnjvm* vm = th->getJVM();<br>
+  UserClass* cl = th->getCallingClassLevel(n);<br>
+  assert(cl);<br>
+  JavaObject * const * res = cl->getClassDelegateePtr(vm);<br>
+  RETURN_FROM_JNI((jclass)res);<br>
+<br>
+  END_JNI_EXCEPTION<br>
+<br>
+  return 0;<br>
 }<br>
<br>
 /*<br>
@@ -783,7 +880,8 @@ JVM_FindSignal(const char *name) {<br>
  */<br>
 JNIEXPORT jboolean JNICALL<br>
 JVM_DesiredAssertionStatus(JNIEnv *env, jclass unused, jclass cls) {<br>
-  NYI();<br>
+  // TODO: Actually implement?<br>
+  return JNI_FALSE;<br>
 }<br>
<br>
 /*<br>
@@ -1142,7 +1240,16 @@ JVM_IsSameClassPackage(JNIEnv *env, jclass<br>
class1, jclass class2) {<br>
  */<br>
 JNIEXPORT jint JNICALL<br>
 JVM_GetLastErrorString(char *buf, int len) {<br>
-  NYI();<br>
+  BEGIN_JNI_EXCEPTION<br>
+  char * err = strerror_r(errno, buf, len);<br>
+  if (err != buf)<br>
+    strncpy(buf, err, len);<br>
+<br>
+  RETURN_FROM_JNI(strlen(buf));<br>
+<br>
+  END_JNI_EXCEPTION<br>
+<br>
+  return 0;<br>
 }<br>
<br>
 /*<br>
@@ -1349,7 +1456,7 @@ JVM_SetSockOpt(jint fd, int level, int optname,<br>
const char *optval, int optlen)<br>
<br>
 JNIEXPORT int JNICALL<br>
 JVM_GetHostName(char* name, int namelen) {<br>
-  NYI();<br>
+  return gethostname(name, namelen);<br>
 }<br>
<br>
 /*<br>
@@ -1363,7 +1470,7 @@ JVM_GetHostName(char* name, int namelen) {<br>
  */<br>
 int<br>
 jio_vsnprintf(char *str, size_t count, const char *fmt, va_list args) {<br>
-  NYI();<br>
+  return vsnprintf(str, count, fmt, args);<br>
 }<br>
<br>
 int<br>
<font color="#888888">--<br>
1.7.5.1<br>
_______________________________________________<br>
vmkit-commits mailing list<br>
<a href="mailto:vmkit-commits@cs.uiuc.edu">vmkit-commits@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/vmkit-commits" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/vmkit-commits</a><br>
</font></blockquote></div><br>