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

Nicolas Geoffray nicolas.geoffray at gmail.com
Thu Oct 27 09:55:57 PDT 2011


Looks good!

On Thu, Oct 27, 2011 at 3:50 AM, Will Dietz <wdietz2 at illinois.edu> wrote:

> 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
> _______________________________________________
> vmkit-commits mailing list
> vmkit-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/vmkit-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/vmkit-commits/attachments/20111027/440c31ba/attachment.html>


More information about the vmkit-commits mailing list