diff -Naur jamvm-1.2.0/src/arm/lock_md.h jamvm-1.2.0-mb/src/arm/lock_md.h --- jamvm-1.2.0/src/arm/lock_md.h 2004-08-18 20:54:02.000000000 +0100 +++ jamvm-1.2.0-mb/src/arm/lock_md.h 2004-11-15 03:35:27.000000000 +0000 @@ -61,3 +61,6 @@ : "r" (addr), "r" (new_val) \ : "cc", "memory"); \ } while(0) + +#define MBARRIER() __asm__ __volatile__ ("" ::: "memory") + diff -Naur jamvm-1.2.0/src/i386/lock_md.h jamvm-1.2.0-mb/src/i386/lock_md.h --- jamvm-1.2.0/src/i386/lock_md.h 2004-08-18 20:54:02.000000000 +0100 +++ jamvm-1.2.0-mb/src/i386/lock_md.h 2004-11-15 02:31:12.000000000 +0000 @@ -34,3 +34,7 @@ #define ATOMIC_READ(addr) *addr #define ATOMIC_WRITE(addr, value) *addr = value + +#define MBARRIER() __asm__ __volatile__ ("lock; addl $0,0(%%esp)" ::: "memory") + + diff -Naur jamvm-1.2.0/src/interp.c jamvm-1.2.0-mb/src/interp.c --- jamvm-1.2.0/src/interp.c 2004-09-03 08:57:36.000000000 +0100 +++ jamvm-1.2.0-mb/src/interp.c 2004-11-15 03:35:53.000000000 +0000 @@ -69,15 +69,19 @@ #define OPCODE_REWRITE_OPERAND1(pc, opcode, operand1) \ { \ pc[0] = OPC_LOCK; \ + MBARRIER(); \ pc[1] = operand1; \ + MBARRIER(); \ pc[0] = opcode; \ } #define OPCODE_REWRITE_OPERAND2(pc, opcode, operand1, operand2) \ { \ pc[0] = OPC_LOCK; \ + MBARRIER(); \ pc[1] = operand1; \ pc[2] = operand2; \ + MBARRIER(); \ pc[0] = opcode; \ } diff -Naur jamvm-1.2.0/src/lock.c jamvm-1.2.0-mb/src/lock.c --- jamvm-1.2.0/src/lock.c 2004-08-30 11:48:12.000000000 +0100 +++ jamvm-1.2.0-mb/src/lock.c 2004-11-15 02:08:47.000000000 +0000 @@ -29,7 +29,7 @@ #include "hash.h" #include "alloc.h" -#include "lock_md.h" +#include "lock.h" /* Trace lock operations and inflation/deflation */ #ifdef TRACELOCK diff -Naur jamvm-1.2.0/src/lock.h jamvm-1.2.0-mb/src/lock.h --- jamvm-1.2.0/src/lock.h 2004-08-18 20:54:02.000000000 +0100 +++ jamvm-1.2.0-mb/src/lock.h 2004-11-15 02:08:34.000000000 +0000 @@ -19,6 +19,7 @@ */ #include "thread.h" +#include "lock_md.h" extern void monitorInit(Monitor *mon); extern void monitorLock(Monitor *mon, Thread *self); diff -Naur jamvm-1.2.0/src/powerpc/lock_md.h jamvm-1.2.0-mb/src/powerpc/lock_md.h --- jamvm-1.2.0/src/powerpc/lock_md.h 2004-08-18 20:54:02.000000000 +0100 +++ jamvm-1.2.0-mb/src/powerpc/lock_md.h 2004-11-15 03:32:53.000000000 +0000 @@ -38,3 +38,5 @@ #define ATOMIC_READ(addr) *addr #define ATOMIC_WRITE(addr, value) *addr = value + +#define MBARRIER() __asm__ __volatile__ ("" ::: "memory") diff -Naur jamvm-1.2.0/src/resolve.c jamvm-1.2.0-mb/src/resolve.c --- jamvm-1.2.0/src/resolve.c 2004-08-18 20:54:02.000000000 +0100 +++ jamvm-1.2.0-mb/src/resolve.c 2004-11-15 02:42:16.000000000 +0000 @@ -21,6 +21,7 @@ #include #include #include "jam.h" +#include "lock.h" MethodBlock *findMethod(Class *class, char *methodname, char *type) { ClassBlock *cb = CLASS_CB(class); @@ -118,7 +119,9 @@ return NULL; CP_TYPE(cp, cp_index) = CONSTANT_Locked; + MBARRIER(); CP_INFO(cp, cp_index) = (u4)resolved_class; + MBARRIER(); CP_TYPE(cp, cp_index) = CONSTANT_Resolved; break; @@ -179,7 +182,9 @@ initClass(mb->class); CP_TYPE(cp, cp_index) = CONSTANT_Locked; + MBARRIER(); CP_INFO(cp, cp_index) = (u4)mb; + MBARRIER(); CP_TYPE(cp, cp_index) = CONSTANT_Resolved; } else signalException("java/lang/NoSuchMethodError", methodname); @@ -237,7 +242,9 @@ if(mb) { CP_TYPE(cp, cp_index) = CONSTANT_Locked; + MBARRIER(); CP_INFO(cp, cp_index) = (u4)mb; + MBARRIER(); CP_TYPE(cp, cp_index) = CONSTANT_Resolved; } else signalException("java/lang/NoSuchMethodError", methodname); @@ -284,7 +291,9 @@ initClass(fb->class); CP_TYPE(cp, cp_index) = CONSTANT_Locked; + MBARRIER(); CP_INFO(cp, cp_index) = (u4)fb; + MBARRIER(); CP_TYPE(cp, cp_index) = CONSTANT_Resolved; } else signalException("java/lang/NoSuchFieldError", fieldname); @@ -314,7 +323,9 @@ if(string) { CP_TYPE(cp, cp_index) = CONSTANT_Locked; + MBARRIER(); CP_INFO(cp, cp_index) = (u4)findInternedString(string); + MBARRIER(); CP_TYPE(cp, cp_index) = CONSTANT_Resolved; }