[vmkit-commits] [PATCH] OpenJDK.inc: Implement misc simple-ish JVM_* methods

Will Dietz wdietz2 at illinois.edu
Wed Oct 26 18:50:41 PDT 2011


Inlined below.

~Will


>From 181165b4d5032c347dd7d29ac79acbef2fea7c16 Mon Sep 17 00:00:00 2001
From: Will Dietz <w at wdtz.org>
Date: Wed, 26 Oct 2011 20:47:40 -0500
Subject: [PATCH] OpenJDK.inc: Implement misc simple-ish JVM_* methods

---
 lib/J3/ClassLib/OpenJDK/OpenJDK.inc |  157 +++++++++++++++++++++++++++++------
 1 files changed, 132 insertions(+), 25 deletions(-)

diff --git a/lib/J3/ClassLib/OpenJDK/OpenJDK.inc
b/lib/J3/ClassLib/OpenJDK/OpenJDK.inc
index ae64e32..e5690a5 100644
--- a/lib/J3/ClassLib/OpenJDK/OpenJDK.inc
+++ b/lib/J3/ClassLib/OpenJDK/OpenJDK.inc
@@ -1,7 +1,18 @@
 // vim: set ft=cpp:
 // TODO: Add comment header like the rest of VMKit

-#include <jvm.h>
+#include "jvm.h"
+#include "Reader.h"
+#include "JavaConstantPool.h"
+#include "SetProperties.inc"
+
+#include <sys/time.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <signal.h>
+#include <errno.h>
+#include <sys/ioctl.h>

 #define NYI() \
   do{ assert(0 && "Not yet implemented!"); abort(); } while(0)
@@ -9,7 +20,7 @@

 JNIEXPORT jint JNICALL
 JVM_GetInterfaceVersion(void) {
-  NYI();
+  return JVM_INTERFACE_VERSION;
 }

 jint JVM_CreateJavaVM(JavaVM **pvm, void **penv, void *args) {
@@ -18,22 +29,55 @@ jint JVM_CreateJavaVM(JavaVM **pvm, void **penv,
void *args) {

 JNIEXPORT jint JNICALL
 JVM_IHashCode(JNIEnv *env, jobject _obj) {
-  NYI();
+  JavaObject * obj = *(JavaObject**)_obj;
+  llvm_gcroot(obj, 0);
+
+  jint hash = (obj == NULL) ? 0 : JavaObject::hashCode(obj);
+  return hash;
 }

 JNIEXPORT void JNICALL
 JVM_MonitorWait(JNIEnv *env, jobject obj, jlong ms) {
-  NYI();
+  JavaObject * o = 0;
+  llvm_gcroot(o, 0);
+
+  BEGIN_JNI_EXCEPTION
+  Jnjvm* vm = JavaThread::get()->getJVM();
+
+  o = *(JavaObject**)obj;
+
+  if (ms < 0) {
+    vm->illegalArgumentException("Negative wait time specified");
+  }
+  if (ms) {
+    struct timeval info;
+    uint64_t usec = ms * 1000LL;
+    info.tv_usec = usec % 1000000LL;
+    info.tv_sec = usec / 1000000LL;
+    JavaObject::timedWait(o, info);
+  } else {
+    JavaObject::wait(o);
+  }
+  RETURN_VOID_FROM_JNI
+  END_JNI_EXCEPTION
 }

 JNIEXPORT void JNICALL
 JVM_MonitorNotify(JNIEnv *env, jobject obj) {
-  NYI();
+  BEGIN_JNI_EXCEPTION
+  JavaObject * o = *(JavaObject**)obj;
+  JavaObject::notify(o);
+  RETURN_VOID_FROM_JNI
+  END_JNI_EXCEPTION
 }

 JNIEXPORT void JNICALL
 JVM_MonitorNotifyAll(JNIEnv *env, jobject obj) {
-  NYI();
+  BEGIN_JNI_EXCEPTION
+  JavaObject * o = *(JavaObject**)obj;
+  JavaObject::notifyAll(o);
+  RETURN_VOID_FROM_JNI
+  END_JNI_EXCEPTION
 }

 JNIEXPORT jobject JNICALL
@@ -54,12 +98,22 @@ JVM_InternString(JNIEnv *env, jstring _str) {
  */
 JNIEXPORT jlong JNICALL
 JVM_CurrentTimeMillis(JNIEnv *env, jclass ignored) {
-  NYI();
+  struct timeval tv;
+  gettimeofday(&tv, NULL);
+  jlong time = (tv.tv_sec * 1000LL) + (tv.tv_usec / 1000LL);
+  return time;
 }

 JNIEXPORT jlong JNICALL
 JVM_NanoTime(JNIEnv *env, jclass ignored) {
-  NYI();
+  // TODO: Impl with more accurate clock?
+  struct timeval tv;
+
+  gettimeofday(&tv, NULL);
+
+  jlong time = (tv.tv_sec * 1000000LL) + (tv.tv_usec / 1000000LL);
+
+  return time;
 }

 JNIEXPORT void JNICALL
@@ -70,7 +124,17 @@ JVM_ArrayCopy(JNIEnv *env, jclass ignored, jobject
jsrc, jint sstart,

 JNIEXPORT jobject JNICALL
 JVM_InitProperties(JNIEnv *env, jobject p) {
-  NYI();
+  BEGIN_JNI_EXCEPTION
+  JavaObject * prop = *(JavaObject**)p;
+  llvm_gcroot(prop, 0);
+  setProperties(prop);
+  setCommandLineProperties(prop);
+
+  RETURN_FROM_JNI(p);
+
+  END_JNI_EXCEPTION
+
+  return 0;
 }

 /*
@@ -86,17 +150,20 @@ JVM_OnExit(void (*func)(void)) {
  */
 JNIEXPORT void JNICALL
 JVM_Exit(jint code) {
-  NYI();
+  mvm::System::Exit(code);
 }

 JNIEXPORT void JNICALL
 JVM_Halt(jint code) {
-  NYI();
+  mvm::System::Exit(code);
 }

 JNIEXPORT void JNICALL
 JVM_GC(void) {
-  NYI();
+  BEGIN_JNI_EXCEPTION
+  mvm::Collector::collect();
+  RETURN_VOID_FROM_JNI;
+  END_JNI_EXCEPTION
 }

 /* Returns the number of real-time milliseconds that have elapsed since the
@@ -130,27 +197,33 @@ JVM_TraceMethodCalls(jboolean on) {

 JNIEXPORT jlong JNICALL
 JVM_TotalMemory(void) {
-  NYI();
+  return (jlong)mvm::Collector::getTotalMemory();
 }

 JNIEXPORT jlong JNICALL
 JVM_FreeMemory(void) {
-  NYI();
+  return (jlong)mvm::Collector::getFreeMemory();
 }

 JNIEXPORT jlong JNICALL
 JVM_MaxMemory(void) {
-  NYI();
+  return (jlong)mvm::Collector::getMaxMemory();
 }

 JNIEXPORT jint JNICALL
 JVM_ActiveProcessorCount(void) {
-  NYI();
+  return mvm::System::GetNumberOfProcessors();
 }

 JNIEXPORT void * JNICALL
 JVM_LoadLibrary(const char *name) {
-  NYI();
+  BEGIN_JNI_EXCEPTION
+  Jnjvm* vm = JavaThread::get()->getJVM();
+  RETURN_FROM_JNI(vm->bootstrapLoader->loadLib(name));
+
+  END_JNI_EXCEPTION
+
+  return 0;
 }

 JNIEXPORT void JNICALL
@@ -160,7 +233,14 @@ JVM_UnloadLibrary(void * handle) {

 JNIEXPORT void * JNICALL
 JVM_FindLibraryEntry(void *handle, const char *name) {
-  NYI();
+  BEGIN_JNI_EXCEPTION
+  Jnjvm* vm = JavaThread::get()->getJVM();
+  bool j3 = false;
+  RETURN_FROM_JNI((void *)vm->bootstrapLoader->loadInLib(name, j3));
+
+  END_JNI_EXCEPTION
+
+  return 0;
 }

 JNIEXPORT jboolean JNICALL
@@ -272,7 +352,7 @@ JVM_SetThreadPriority(JNIEnv *env, jobject thread,
jint prio) {

 JNIEXPORT void JNICALL
 JVM_Yield(JNIEnv *env, jclass threadClass) {
-  NYI();
+  mvm::Thread::yield();
 }

 JNIEXPORT void JNICALL
@@ -282,7 +362,12 @@ JVM_Sleep(JNIEnv *env, jclass threadClass, jlong millis) {

 JNIEXPORT jobject JNICALL
 JVM_CurrentThread(JNIEnv *env, jclass threadClass) {
-  NYI();
+  BEGIN_JNI_EXCEPTION
+  JavaThread* th = JavaThread::get();
+  RETURN_FROM_JNI((jobject)th->pushJNIRef(th->currentThread()));
+  END_JNI_EXCEPTION
+
+  return 0;
 }

 JNIEXPORT jint JNICALL
@@ -444,7 +529,19 @@ JVM_NewMultiArray(JNIEnv *env, jclass eltClass,
jintArray dim) {
  */
 JNIEXPORT jclass JNICALL
 JVM_GetCallerClass(JNIEnv *env, int n) {
-  NYI();
+  BEGIN_JNI_EXCEPTION
+
+  JavaThread* th = JavaThread::get();
+
+  Jnjvm* vm = th->getJVM();
+  UserClass* cl = th->getCallingClassLevel(n);
+  assert(cl);
+  JavaObject * const * res = cl->getClassDelegateePtr(vm);
+  RETURN_FROM_JNI((jclass)res);
+
+  END_JNI_EXCEPTION
+
+  return 0;
 }

 /*
@@ -783,7 +880,8 @@ JVM_FindSignal(const char *name) {
  */
 JNIEXPORT jboolean JNICALL
 JVM_DesiredAssertionStatus(JNIEnv *env, jclass unused, jclass cls) {
-  NYI();
+  // TODO: Actually implement?
+  return JNI_FALSE;
 }

 /*
@@ -1142,7 +1240,16 @@ JVM_IsSameClassPackage(JNIEnv *env, jclass
class1, jclass class2) {
  */
 JNIEXPORT jint JNICALL
 JVM_GetLastErrorString(char *buf, int len) {
-  NYI();
+  BEGIN_JNI_EXCEPTION
+  char * err = strerror_r(errno, buf, len);
+  if (err != buf)
+    strncpy(buf, err, len);
+
+  RETURN_FROM_JNI(strlen(buf));
+
+  END_JNI_EXCEPTION
+
+  return 0;
 }

 /*
@@ -1349,7 +1456,7 @@ JVM_SetSockOpt(jint fd, int level, int optname,
const char *optval, int optlen)

 JNIEXPORT int JNICALL
 JVM_GetHostName(char* name, int namelen) {
-  NYI();
+  return gethostname(name, namelen);
 }

 /*
@@ -1363,7 +1470,7 @@ JVM_GetHostName(char* name, int namelen) {
  */
 int
 jio_vsnprintf(char *str, size_t count, const char *fmt, va_list args) {
-  NYI();
+  return vsnprintf(str, count, fmt, args);
 }

 int
-- 
1.7.5.1



More information about the vmkit-commits mailing list