[vmkit-commits] [PATCH] Impl JVM_InternString, JVM_StartThread, JVM_IsThreadAlive

Nicolas Geoffray nicolas.geoffray at gmail.com
Tue Nov 1 12:25:43 PDT 2011


Looks good! Please commit.

On Tue, Nov 1, 2011 at 5:54 AM, Will Dietz <wdietz2 at illinois.edu> wrote:

> Inlined below.
>
> ~Will
>
> >From 0ed273dac8e45e630b292d52b6463b965d43f265 Mon Sep 17 00:00:00 2001
> From: Will Dietz <w at wdtz.org>
> Date: Mon, 31 Oct 2011 22:16:10 -0500
> Subject: [PATCH 6/8] Impl JVM_InternString, JVM_StartThread,
>  JVM_IsThreadAlive
>
> ---
>  lib/J3/ClassLib/OpenJDK/JavaUpcalls.cpp |   21 -------
>  lib/J3/ClassLib/OpenJDK/OpenJDK.inc     |   95
> ++++++++++++++++++++++++++++++-
>  2 files changed, 92 insertions(+), 24 deletions(-)
>
> diff --git a/lib/J3/ClassLib/OpenJDK/JavaUpcalls.cpp
> b/lib/J3/ClassLib/OpenJDK/JavaUpcalls.cpp
> index d9fa7d7..43ff227 100644
> --- a/lib/J3/ClassLib/OpenJDK/JavaUpcalls.cpp
> +++ b/lib/J3/ClassLib/OpenJDK/JavaUpcalls.cpp
> @@ -367,27 +367,6 @@ extern "C" void
> Java_java_lang_ref_PhantomReference__0003Cinit_0003E__Ljava_lang
>   END_NATIVE_EXCEPTION
>  }
>
> -extern "C" JavaString*
> Java_java_lang_VMString_intern__Ljava_lang_String_2(
> -    JavaString* obj) {
> -  const ArrayUInt16* array = 0;
> -  JavaString* res = 0;
> -  llvm_gcroot(obj, 0);
> -  llvm_gcroot(array, 0);
> -  llvm_gcroot(res, 0);
> -  // If the string is already interned, just return.
> -  if (obj->getVirtualTable() == JavaString::internStringVT) return obj;
> -
> -  BEGIN_NATIVE_EXCEPTION(0)
> -
> -  Jnjvm* vm = JavaThread::get()->getJVM();
> -  array = JavaString::strToArray(obj, vm);
> -  res = vm->constructString(array);
> -
> -  END_NATIVE_EXCEPTION
> -
> -  return res;
> -}
> -
>  extern "C" JavaObject*
> Java_sun_reflect_Reflection_getCallerClass__I(uint32 index) {
>
>   JavaObject* res = 0;
> diff --git a/lib/J3/ClassLib/OpenJDK/OpenJDK.inc
> b/lib/J3/ClassLib/OpenJDK/OpenJDK.inc
> index e0000f2..e19bf96 100644
> --- a/lib/J3/ClassLib/OpenJDK/OpenJDK.inc
> +++ b/lib/J3/ClassLib/OpenJDK/OpenJDK.inc
> @@ -165,7 +165,28 @@ JVM_Clone(JNIEnv *env, jobject obj) {
>  */
>  JNIEXPORT jstring JNICALL
>  JVM_InternString(JNIEnv *env, jstring _str) {
> -  NYI();
> +  JavaString * str = *(JavaString**)_str;
> +  const ArrayUInt16* array = 0;
> +  JavaString * res = 0;
> +  llvm_gcroot(str, 0);
> +  llvm_gcroot(array, 0);
> +  llvm_gcroot(res, 0);
> +
> +  // If already intern'd, just return.
> +  if(str->getVirtualTable() == JavaString::internStringVT)
> +    return _str;
> +
> +  BEGIN_JNI_EXCEPTION
> +
> +  Jnjvm* vm = JavaThread::get()->getJVM();
> +  array = JavaString::strToArray(str, vm);
> +  res = vm->constructString(array);
> +
> +  RETURN_FROM_JNI((jstring)th->pushJNIRef(res))
> +
> +  END_JNI_EXCEPTION
> +
> +  return 0;
>  }
>
>  /*
> @@ -449,12 +470,67 @@ JVM_DisableCompiler(JNIEnv *env, jclass compCls) {
>   NYI();
>  }
>
> +void start(JavaThread* thread) {
> +
> +  JavaObject* javaThread = NULL;
> +  llvm_gcroot(javaThread, 0);
> +
> +  Jnjvm* vm = thread->getJVM();
> +
> +  // Wait some time to let the creator initialise this field
> +  while (thread->javaThread == NULL) {
> +    mvm::Thread::yield();
> +  }
> +
> +  javaThread = thread->javaThread;
> +  assert(javaThread && "Didn't fix the javaThread of a j3 thread");
> +
> +  // Ok, now that the thread is created we can set the the value of eetop
> +  // which points from the javaobject to our internal JavaThread
> +  vm->upcalls->eetop->setInstanceLongField(javaThread, (long)thread);
> +
> +  // If the thread is not a daemon, it is added to the list of threads to
> +  // wait until exit.
> +  bool isDaemon = vm->upcalls->daemon->getInstanceInt8Field(javaThread);
> +
> +  if (!isDaemon) {
> +    vm->threadSystem.enter();
> +  }
> +
> +  assert(javaThread->getVirtualTable());
> +  // Run the VMThread::run function
> +  vm->upcalls->runThread->invokeIntSpecial(vm,
> vm->upcalls->newThread, javaThread);
> +
> +  // Remove the thread from the list.
> +  if (!isDaemon) {
> +    vm->threadSystem.leave();
> +  }
> +}
>  /*
>  * java.lang.Thread
>  */
>  JNIEXPORT void JNICALL
>  JVM_StartThread(JNIEnv *env, jobject _thread) {
> -  NYI();
> +  JavaObject * thread = 0;
> +  JavaThread * javaThread = 0;
> +  llvm_gcroot(thread, 0);
> +  llvm_gcroot(javaThread, 0);
> +  BEGIN_JNI_EXCEPTION
> +
> +  thread = *(JavaObject**)_thread;
> +  assert(thread);
> +  assert(thread->getVirtualTable());
> +  Jnjvm* vm = JavaThread::get()->getJVM();
> +
> +  JavaThread * newTh = new JavaThread(vm);
> +  if (!newTh) vm->outOfMemoryError();
> +  newTh->start((void (*)(mvm::Thread*))start);
> +
> +  newTh->initialise(thread, 0);
> +
> +  RETURN_VOID_FROM_JNI
> +
> +  END_JNI_EXCEPTION
>  }
>
>  JNIEXPORT void JNICALL
> @@ -464,7 +540,20 @@ JVM_StopThread(JNIEnv *env, jobject thread,
> jobject exception) {
>
>  JNIEXPORT jboolean JNICALL
>  JVM_IsThreadAlive(JNIEnv *env, jobject _thread) {
> -  NYI();
> +  BEGIN_JNI_EXCEPTION
> +  JavaObject * thread = *(JavaObject**)_thread;
> +  llvm_gcroot(thread, 0);
> +  assert(thread);
> +
> +  Jnjvm* vm = JavaThread::get()->getJVM();
> +  jint status = vm->upcalls->threadStatus->getInstanceInt32Field(thread);
> +
> +  // TODO: We don't actually maintain 'status'...
> +  RETURN_FROM_JNI(status != 0);
> +
> +  END_JNI_EXCEPTION
> +
> +  return 0;
>  }
>
>  JNIEXPORT void JNICALL
> --
> 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/20111101/5833b936/attachment.html>


More information about the vmkit-commits mailing list