< prev index next >

src/hotspot/share/utilities/singleWriterSynchronizer.cpp

Print this page

        

*** 42,52 **** // Wait until all threads that entered a critical section before // synchronization have exited that critical section. void SingleWriterSynchronizer::synchronize() { // Side-effect in assert balanced by debug-only dec at end. ! assert(Atomic::add(1u, &_writers) == 1u, "multiple writers"); // We don't know anything about the muxing between this invocation // and invocations in other threads. We must start with the latest // _enter polarity, else we could clobber the wrong _exit value on // the first iteration. So fence to ensure everything here follows // whatever muxing was used. --- 42,52 ---- // Wait until all threads that entered a critical section before // synchronization have exited that critical section. void SingleWriterSynchronizer::synchronize() { // Side-effect in assert balanced by debug-only dec at end. ! assert(Atomic::add(&_writers, 1u) == 1u, "multiple writers"); // We don't know anything about the muxing between this invocation // and invocations in other threads. We must start with the latest // _enter polarity, else we could clobber the wrong _exit value on // the first iteration. So fence to ensure everything here follows // whatever muxing was used.
*** 62,72 **** // operations until this change of _enter succeeds. uint old; do { old = value; *new_ptr = ++value; ! value = Atomic::cmpxchg(value, &_enter, old); } while (old != value); // Critical sections entered before we changed the polarity will use // the old exit counter. Critical sections entered after the change // will use the new exit counter. volatile uint* old_ptr = &_exit[old & 1]; --- 62,72 ---- // operations until this change of _enter succeeds. uint old; do { old = value; *new_ptr = ++value; ! value = Atomic::cmpxchg(&_enter, old, value); } while (old != value); // Critical sections entered before we changed the polarity will use // the old exit counter. Critical sections entered after the change // will use the new exit counter. volatile uint* old_ptr = &_exit[old & 1];
< prev index next >