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 <[EMAIL PROTECTED]> 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