harmony-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Pavel Rebriy" <pavel.reb...@gmail.com>
Subject Re: [drlvm][vmmagic] Thread.currentThread() helper creation ploblems
Date Tue, 05 Feb 2008 15:31:35 GMT
Thank you, Mikhail, I've applied you recommendation to the patch.

The question about the second patch, why trap doesn't catch NPE?

On 05/02/2008, Mikhail Fursov <mike.fursov@gmail.com> wrote:
>
> Pavel, I see 2 problems in your code:
>
> 1) Initialize class of the ThreadHelper before using it to avoid mix of
> lazy-resolution mode and vmmagics
> You can do it this way:
> Index:
>
> vm/vmcore/src/kernel_classes/javasrc/org/apache/harmony/drlvm/VMHelper.java
> ===================================================================
> ---
>
> vm/vmcore/src/kernel_classes/javasrc/org/apache/harmony/drlvm/VMHelper.java
> (revision 618229)
> +++
>
> vm/vmcore/src/kernel_classes/javasrc/org/apache/harmony/drlvm/VMHelper.java
> (working copy)
> @@ -60,6 +60,8 @@
>
>      // preload @Inline vmmagic class
>      static final Class pragmaInline = org.vmmagic.pragma.Inline.class;
> +    static final Class threadHelper =
> org.apache.harmony.drlvm.thread.ThreadHelper.class;
> +    static final Class vmFastPathes =
> org.apache.harmony.drlvm.VMHelperFastPath.class;
>
>
> 2) Do not mix 'null' and Address in your code while using Jitrino.OPT. Use
> Address.zero() instead of managed 'null'.
>
> So, I propose changing ThreadHelper's method to this one:
>
> Index:
>
> vm/vmcore/src/kernel_classes/javasrc/org/apache/harmony/drlvm/thread/ThreadHelper.java
> ===================================================================
> ---
>
> vm/vmcore/src/kernel_classes/javasrc/org/apache/harmony/drlvm/thread/ThreadHelper.java
> (revision 618229)
> +++
>
> vm/vmcore/src/kernel_classes/javasrc/org/apache/harmony/drlvm/thread/ThreadHelper.java
> (working copy)
> @@ -31,6 +31,7 @@
>
>      public static final int LOCK_WORD_OFFSET    = getLockWordOffset();
>      public static final int TLS_THREAD_ID_OFFSET= getThreadIdOffset();
> +    public static final int THREAD_JAVA_OBJECT_OFFSET =
> getThreadJavaObjectOffset();
>
>      @Inline
>      static int getThreadId() {
> @@ -40,6 +41,16 @@
>      }
>
>      @Inline
> +    public static Thread getCurrentThread() {
> +        Address tlsThread = VMHelper.getTlsBaseAddress();
>
> +        Address javaObjectPtr = tlsThread.plus
> (THREAD_JAVA_OBJECT_OFFSET).loadAddress();
>
> +        if (javaObjectPtr.isZero()) {
> +            return null;
> +        }
> +        return
> (Thread)javaObjectPtr.loadAddress().toObjectReference().toObject();
> +    }
>
>
>
> Tell me if you have more problems.
>
>
> On Feb 5, 2008 6:46 PM, Pavel Rebriy <pavel.rebriy@gmail.com> wrote:
>
> > Hello,
> >
> > Working on HARMONY-4555 [1] I've tried to create VMMagic helper for
> > Thread.currentThread() function but faced with some difficulties related
> > to
> > VMMagic mechanism.
> > Missing detailed patch (you can see it in JIRA [1]) I'm going to show
> > problematic function. Here they are:
> >
> > 1. org.apache.harmony.drlvm.thread.ThreadHelper.getCurrentThreadAddr()
> >
> > @Inline
> > public static Address getCurrentThreadAddr() {
> >        Address tlsThread = VMHelper.getTlsBaseAddress();
> >        Address javaObjectPtr = tlsThread.plus
> > (THREAD_JAVA_OBJECT_OFFSET).loadAddress();
> >        return javaObjectPtr.isZero() ? null : javaObjectPtr.loadAddress
> ();
> > }
> >
> > 2. java.lang.VMThreadManager.currentThread()
> >
> > static Thread currentThread() {
> >    if (VMHelper.isVMMagicPackageSupported()) {
> >         Address currentThreadAddr = ThreadHelper.getCurrentThreadAddr();
> >         if (currentThreadAddr.isZero()) {
> >             return null;
> >         } else {
> >             return
> > (Thread)currentThreadAddr.toObjectReference().toObject();
> >         }
> >     }
> >     return currentThreadNative();
> > }
> >
> > As you can see the 1st function is inline and the 2nd calls the 1st. The
> > 1st
> > function can return null in case if thread don't attached yet to VM (for
> > instance if you call Thread.currentThread() during execution of
> > constructor
> > of current Java thread).
> >
> > Tested test is the following:
> >
> > public class CurrentThreadTest {
> >    public static void main(String[] args) {
> >        long st = System.currentTimeMillis();
> >        for(int i=0; i< 100000000; i++) {
> >            Thread.currentThread();
> >        }
> >        long res = System.currentTimeMillis()-st;
> >        System.out.println("res="+res);
> >    }
> > }
> >
> > Helper implemented in such way causes to crash in JIT on it (see [1] to
> > detailed stack).
> >
> > Question is: Is it incorrect implementation of helper function? Where is
> > the
> > problem?
> >
> > I've tried to another version of helper which is not so good as the
> first
> > try:
> >
> > 1. org.apache.harmony.drlvm.thread.ThreadHelper.getCurrentThreadAddr()
> >
> > @Inline
> > public static Address getCurrentThreadAddr() {
> > public static Address getCurrentThreadAddr() {
> >     Address tlsThread = VMHelper.getTlsBaseAddress();
> >     Address javaObjectPtr = tlsThread.plus
> > (THREAD_JAVA_OBJECT_OFFSET).loadAddress();
> >     return javaObjectPtr.loadAddress();
> > }
> >
> > 2. java.lang.VMThreadManager.currentThread()
> >
> > static Thread currentThread() {
> >     if (VMHelper.isVMMagicPackageSupported()) {
> >         try {
> >             return
> >
> >
> (Thread)ThreadHelper.getCurrentThreadAddr().toObjectReference().toObject();
> >         } catch (NullPointerException e) {
> >             return null;
> >         }
> >     }
> >     return currentThreadNative();
> > }
> >
> > Second helper doesn't lead to crash but throws NullPointerException in
> >
> > <<<< return
> >
> >
> (Thread)ThreadHelper.getCurrentThreadAddr().toObjectReference().toObject();
> > >>>>
> >
> > line.
> >
> > Question is: Why trap doesn't catch NullPointerException? Helper
> problems?
> >
> > I've modified getCurrentThreadAddr() function to force throwing
> exception
> > case:
> >
> > 1. org.apache.harmony.drlvm.thread.ThreadHelper.getCurrentThreadAddr()
> >
> > @Inline
> > public static Address getCurrentThreadAddr() {
> >     Address tlsThread = VMHelper.getTlsBaseAddress();
> >     Address javaObjectPtr = tlsThread.plus
> > (THREAD_JAVA_OBJECT_OFFSET).loadAddress();
> >     if (javaObjectPtr != null) {
> >         return javaObjectPtr.loadAddress();
> >     } else {
> >         throw new NullPointerException();
> >     }
> > }
> >
> > After it the test passes.
> >
> > Could any JIT experts help me to understand the root of the problems?
> >
> > [1] http://issues.apache.org/jira/browse/HARMONY-4555
> >
> > --
> > Best regards,
> > Pavel Rebriy
> >
>
>
>
>
> --
>
> Mikhail Fursov
>



-- 
Best regards,
Pavel Rebriy

Mime
  • Unnamed multipart/alternative (inline, None, 0 bytes)
View raw message