Florian Weimer writes: > * Samuel Tardieu: > > > On 27/10, Florian Weimer wrote: > > > > | (I can't reproduce the conditional store with my GCC 4.2 installation, > > | though.) > > > > You need "-O -fno-inline" to trigger it on this particular example > > (you don't need "-fno-inline" if you put "Lock" in a separate package). > > Ah, thanks. I see it now. > > If not for Ada, we need to fix it for Java. The following snippet shows > the same problem: > > class C { > static volatile boolean flag; > static int shared; > public void maybe_increment() { > if (flag) > ++shared; > } > } > > _ZN1C15maybe_incrementEJvv: > .LFB3: > movzbl _ZN1C4flagE(%rip), %eax > cmpb $1, %al > movl _ZN1C6sharedE(%rip), %eax > sbbl $-1, %eax > movl %eax, _ZN1C6sharedE(%rip) > ret > > And the 1.5 memory model should really, really prevent that (if not, > it's broken).
The Java 1.5 memory model will prevent that. I'm hoping Ian Taylor's patch will fix this problem for Java as well as C. Andrew.