It is possible that we're fixing calls to method X() and another
thread is compiling method Y() which calls X(). Call sites from Y
might be added to X's trampoline but Y's ->objcode might not be set
yet. We should skip fixing call sites coming from not yet compiled
methods.
This causes the folowing crash to occurre:
[thread: Thread-1] SIGSEGV at EIP 0805eaa7 while accessing memory address
00000000.
Registers:
eax: 00000000 ebx: 08308a74 ecx: 08ba2b98 edx: a6210c10
esi: a6210c88 edi: a6212be0 ebp: a7b312f0 esp: a7b312c4
Native and JAVA stack trace:
[<0805eaa7>] native : fixup_site_addr+f (jato/jit/fixup-site.c:59)
[<08062d4e>] native : jit_magic_trampoline+1b6
(jato/jato/jit/trampoline.c:143)
[<a7bd3bcc>] trampoline : java/lang/System.currentTimeMillis(System.java:222)
[<a7be96ad>] jit : java/lang/VMThread.sleep(VMThread.java:393)
[<a7be9471>] jit : java/lang/Thread.sleep(Thread.java:896)
[<a7be926b>] jit : java/lang/Thread.sleep(Thread.java:861)
[<a7be9209>] jit : Test.run(Test.java:11)
[<a7be8f05>] jit : java/lang/VMThread.run(VMThread.java:120)
[<0806db07>] native : vm_call_method_a+147 (jato/jato/vm/call.c:76)
[<0806dbd4>] native : vm_call_method_v+57 (jato/jato/vm/call.c:114)
[<0806c956>] native : vm_call_method+e792 (jato/jato/include/vm/call.h:33)
[<0806c986>] native : vm_thread_entry+2a (jato/jato/vm/thread.c:207)
[<b7ed018a>] native : <unknown>
[<b7d2486d>] native : <unknown>
For the following test case. Method which is being compiled is
java/lang/VMThread.sleep() and method to which calls are being fixed
up (in another thread) is java/lang/System.currentTimeMillis():
public class Test extends Thread {
public static Object syn;
static class A {
public static int x = 0;
};
public void run() {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
}
A.x++;
}
public static void main(String[] args) {
Thread t[] = new Thread[20];
syn = new Object();
for (int i = 0; i < t.length; i++) {
t[i] = new Test();
}
for (int i = 0; i < t.length; i++) {
t[i].start();
}
for (int i = 0; i < t.length; i++) {
try {
t[i].join();
} catch (Exception e) {}
}
}
}
Signed-off-by: Tomek Grabiec <[email protected]>
---
arch/x86/emit-code.c | 16 ++++++++++++++++
jit/trampoline.c | 18 +++++++++++-------
2 files changed, 27 insertions(+), 7 deletions(-)
diff --git a/arch/x86/emit-code.c b/arch/x86/emit-code.c
index 1e57d8a..57de052 100644
--- a/arch/x86/emit-code.c
+++ b/arch/x86/emit-code.c
@@ -392,6 +392,22 @@ void fixup_direct_calls(struct jit_trampoline *t, unsigned
long target)
fixup_list_node) {
unsigned char *site_addr;
uint32_t new_target;
+ bool is_compiled;
+
+ /*
+ * XXX: it is possible that we're fixing calls to
+ * method X() and another thread is compiling method
+ * Y() which calls X(). Call sites from Y might be
+ * added to X's trampoline but Y's ->objcode might not
+ * be set yet. We should skip fixing callsites coming
+ * from not yet compiled methods. .
+ */
+ pthread_mutex_lock(&this->cu->mutex);
+ is_compiled = this->cu->is_compiled;
+ pthread_mutex_unlock(&this->cu->mutex);
+
+ if (!is_compiled)
+ continue;
site_addr = fixup_site_addr(this);
new_target = target - ((unsigned long) site_addr +
CALL_INSN_SIZE);
diff --git a/jit/trampoline.c b/jit/trampoline.c
index 122b58a..fef9dd1 100644
--- a/jit/trampoline.c
+++ b/jit/trampoline.c
@@ -139,15 +139,19 @@ void *jit_magic_trampoline(struct compilation_unit *cu)
* Therefore, do fixup for direct call sites unconditionally and fixup
* vtables if method can be invoked via invokevirtual.
*/
- if (ret)
- fixup_direct_calls(method->trampoline, (unsigned long) ret);
-
pthread_mutex_unlock(&cu->mutex);
- /* XXX: this must be done with cu->mutex unlocked because fixup_static()
- * might need to lock it. */
- if (ret && vm_method_is_static(cu->method))
- fixup_static(cu->method->class);
+ /*
+ * XXX: this must be done with cu->mutex unlocked because both
+ * fixup_static() and fixup_direct_calls() might need to lock
+ * on this compilation unit.
+ */
+ if (ret) {
+ fixup_direct_calls(method->trampoline, (unsigned long) ret);
+
+ if (vm_method_is_static(cu->method))
+ fixup_static(cu->method->class);
+ }
return ret;
}
--
1.6.0.6
------------------------------------------------------------------------------
Let Crystal Reports handle the reporting - Free Crystal Reports 2008 30-Day
trial. Simplify your report design, integration and deployment - and focus on
what you do best, core application coding. Discover what's new with
Crystal Reports now. http://p.sf.net/sfu/bobj-july
_______________________________________________
Jatovm-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/jatovm-devel