On Thu, Oct 27, 2011 at 10:02 PM, Will Dietz <span dir="ltr"><<a href="mailto:wdietz2@illinois.edu">wdietz2@illinois.edu</a>></span> wrote:<br><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
Nevermind.  From what you said about the VMThread tracing I think<br>
things on that front clicked, and this is all wrong now :).<br>
<br>
Still need to tackle mapping various objects to their internal<br>
representation, but for example realizing that the<br>
Object/Class/Method/Constructor are explicitly not GC-allocated makes<br>
that easier.<br></blockquote><div><br></div><div>What do you mean? Java objects are always GC-allocated. VMKit internal structures like j3::JavaMethod or j3::JavaField are malloced.</div><div><br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">

<br>
However the field layout is wrong, and the protection domain is wrong...<br>
<br>
I'll get back to you :).<br>
<font color="#888888"><br></font></blockquote><div><br></div><div>OK. Note that I understand the problem and have a few ideas we could discuss. But please do as you think would be best, and we can then talk :)</div><div>
<br></div><div>Nicolas</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;"><font color="#888888">
~Will<br>
</font><div><div></div><div class="h5"><br>
On Wed, Oct 26, 2011 at 9:17 PM, Will Dietz <<a href="mailto:wdietz2@illinois.edu">wdietz2@illinois.edu</a>> wrote:<br>
> Inlined below.<br>
><br>
> This raises a question that I'm not sure I have a good answer to in<br>
> general: how to replace the various 'vmdata' mappings that GNU<br>
> Classpath so nicely provides?<br>
><br>
> Here I stash things in a static map, and it seems to work fine.  However:<br>
> a)where does the map really belong? The Jnjvm?<br>
> b)seems like a bad idea to put GC'd pointers in a stl container, but I<br>
> could be wrong.<br>
><br>
> Is there a general way to map /from/ a JavaObject?<br>
><br>
> We have this issue with java.lang.Thread -> JavaThread, and<br>
> java.lang.ClassLoader -> JnjvmClassLoader (don't bother with<br>
> VMClassLoader intermediate in OpenJDK port, maybe that's a mistake),<br>
> so this is worth discussing/solving.<br>
><br>
> However those instances I'm able to abuse existing fields ('eetop' for<br>
> JavaThread, and 'classes' for ClassLoader), and the biggest issues<br>
> there seems to be ensuring that plays nice with GC stuff.<br>
><br>
> Anyway, thoughts welcome :).<br>
><br>
> ~Will<br>
><br>
><br>
> From 4e25b2c950aff018261054ca13baeeadb72d6df1 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 18:23:38 -0500<br>
> Subject: [PATCH 1/2] Update classpathreflect--field layout, class mapping.<br>
><br>
> ---<br>
>  lib/J3/ClassLib/OpenJDK/ClasspathReflect.cpp |    1 +<br>
>  lib/J3/ClassLib/OpenJDK/ClasspathReflect.h   |   47 ++++++++-----------------<br>
>  2 files changed, 16 insertions(+), 32 deletions(-)<br>
><br>
> diff --git a/lib/J3/ClassLib/OpenJDK/ClasspathReflect.cpp<br>
> b/lib/J3/ClassLib/OpenJDK/ClasspathReflect.cpp<br>
> index 3d69fa4..31dd417 100644<br>
> --- a/lib/J3/ClassLib/OpenJDK/ClasspathReflect.cpp<br>
> +++ b/lib/J3/ClassLib/OpenJDK/ClasspathReflect.cpp<br>
> @@ -14,6 +14,7 @@<br>
><br>
>  namespace j3 {<br>
><br>
> +std::map<JavaObjectClass*, UserCommonClass*> JavaObjectClass::ClassMap;<br>
>  JavaMethod* JavaObjectConstructor::getInternalMethod(JavaObjectConstructor*<br>
> self) {<br>
>   llvm_gcroot(self, 0);<br>
>   UserCommonClass* cls = JavaObjectClass::getClass(self->declaringClass);<br>
> diff --git a/lib/J3/ClassLib/OpenJDK/ClasspathReflect.h<br>
> b/lib/J3/ClassLib/OpenJDK/ClasspathReflect.h<br>
> index 08042b3..101e726 100644<br>
> --- a/lib/J3/ClassLib/OpenJDK/ClasspathReflect.h<br>
> +++ b/lib/J3/ClassLib/OpenJDK/ClasspathReflect.h<br>
> @@ -16,25 +16,27 @@<br>
>  #include "JavaObject.h"<br>
>  #include "JavaThread.h"<br>
><br>
> +#include <map><br>
>  namespace j3 {<br>
><br>
>  class JavaObjectClass : public JavaObject {<br>
>  private:<br>
> -  JavaObject* signers;<br>
> -  JavaObject* pd;<br>
> -  UserCommonClass* vmdata;<br>
> +  static std::map<JavaObjectClass*, UserCommonClass*> ClassMap;<br>
>   JavaObject* constructor;<br>
> +  JavaObject* newInstanceCallerCache;<br>
> +  JavaObject* name;<br>
> +  JavaObject* pd;<br>
><br>
>  public:<br>
><br>
>   static UserCommonClass* getClass(JavaObjectClass* cl) {<br>
>     llvm_gcroot(cl, 0);<br>
> -    return cl->vmdata;<br>
> +    return ClassMap[cl];<br>
>   }<br>
><br>
>   static void setClass(JavaObjectClass* cl, UserCommonClass* vmdata) {<br>
>     llvm_gcroot(cl, 0);<br>
> -    cl->vmdata = vmdata;<br>
> +    ClassMap[cl] = vmdata;<br>
>   }<br>
><br>
>   static void setProtectionDomain(JavaObjectClass* cl, JavaObject* pd) {<br>
> @@ -50,11 +52,12 @@ public:<br>
>   }<br>
><br>
>   static void staticTracer(JavaObjectClass* obj, word_t closure) {<br>
> -    mvm::Collector::markAndTrace(obj, &obj->pd, closure);<br>
> -    mvm::Collector::markAndTrace(obj, &obj->signers, closure);<br>
>     mvm::Collector::markAndTrace(obj, &obj->constructor, closure);<br>
> -    if (obj->vmdata) {<br>
> -      JavaObject** Obj = obj->vmdata->classLoader->getJavaClassLoaderPtr();<br>
> +    mvm::Collector::markAndTrace(obj, &obj->newInstanceCallerCache, closure);<br>
> +    mvm::Collector::markAndTrace(obj, &obj->name, closure);<br>
> +    mvm::Collector::markAndTrace(obj, &obj->pd, closure);<br>
> +    if (ClassMap[obj]) {<br>
> +      JavaObject** Obj = ClassMap[obj]->classLoader->getJavaClassLoaderPtr();<br>
>       if (*Obj) mvm::Collector::markAndTraceRoot(Obj, closure);<br>
>     }<br>
>   }<br>
> @@ -64,8 +67,8 @@ class JavaObjectField : public JavaObject {<br>
>  private:<br>
>   uint8 flag;<br>
>   JavaObjectClass* declaringClass;<br>
> -  JavaObject* name;<br>
>   uint32 slot;<br>
> +  JavaObject* name;<br>
><br>
>  public:<br>
><br>
> @@ -92,8 +95,8 @@ class JavaObjectMethod : public JavaObject {<br>
>  private:<br>
>   uint8 flag;<br>
>   JavaObjectClass* declaringClass;<br>
> -  JavaObject* name;<br>
>   uint32 slot;<br>
> +  JavaObject* name;<br>
><br>
>  public:<br>
><br>
> @@ -133,32 +136,12 @@ public:<br>
><br>
>  };<br>
><br>
> -class JavaObjectVMThread : public JavaObject {<br>
> -private:<br>
> -  JavaObject* thread;<br>
> -  bool running;<br>
> -  JavaThread* vmdata;<br>
> -<br>
> -public:<br>
> -  static void staticTracer(JavaObjectVMThread* obj, word_t closure) {<br>
> -    mvm::Collector::markAndTrace(obj, &obj->thread, closure);<br>
> -  }<br>
> -<br>
> -  static void setVmdata(JavaObjectVMThread* vmthread,<br>
> -                        JavaThread* internal_thread) {<br>
> -    llvm_gcroot(vmthread, 0);<br>
> -    vmthread->vmdata = internal_thread;<br>
> -  }<br>
> -<br>
> -};<br>
> -<br>
> -<br>
>  class JavaObjectThrowable : public JavaObject {<br>
>  private:<br>
> +  JavaObject* backtrace;<br>
>   JavaObject* detailedMessage;<br>
>   JavaObject* cause;<br>
>   JavaObject* stackTrace;<br>
> -  JavaObject* vmState;<br>
><br>
>  public:<br>
><br>
> --<br>
> 1.7.5.1<br>
><br>
<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>
</div></div></blockquote></div><br>