< prev index next >
src/share/vm/runtime/synchronizer.cpp
Print this page
rev 13331 : Simplify parallel synchronizer roots iterator.
*** 128,138 ****
static void post_monitor_inflate_event(EventJavaMonitorInflate&,
const oop,
const ObjectSynchronizer::InflateCause);
#define CHAINMARKER (cast_to_oop<intptr_t>(-1))
- #define CLAIMEDMARKER (cast_to_oop<intptr_t>(-2))
// =====================> Quick functions
// The quick_* forms are special fast-path variants used to improve
--- 128,137 ----
*** 1946,1966 ****
PaddedEnd<ObjectMonitor>* my_cur = (PaddedEnd<ObjectMonitor>*)_cur;
PaddedEnd<ObjectMonitor>* next_block;
while (true) {
if (my_cur == NULL) return NULL;
!
! if (my_cur->object() == CHAINMARKER) {
! if (my_cur->cas_set_object(CLAIMEDMARKER, CHAINMARKER) == CHAINMARKER) {
! return (void*)my_cur;
! }
} else {
! assert(my_cur->object() == CLAIMEDMARKER, "Must be");
}
-
- next_block = (PaddedEnd<ObjectMonitor> *)next(my_cur);
- my_cur = (PaddedEnd<ObjectMonitor> *)Atomic::cmpxchg_ptr(next_block, &_cur, my_cur);
}
}
bool ParallelObjectSynchronizerIterator::parallel_oops_do(OopClosure* f) {
PaddedEnd<ObjectMonitor>* block = (PaddedEnd<ObjectMonitor>*)claim();
--- 1945,1963 ----
PaddedEnd<ObjectMonitor>* my_cur = (PaddedEnd<ObjectMonitor>*)_cur;
PaddedEnd<ObjectMonitor>* next_block;
while (true) {
if (my_cur == NULL) return NULL;
! next_block = (PaddedEnd<ObjectMonitor> *)next(my_cur);
! void* cas_result = Atomic::cmpxchg_ptr(next_block, &_cur, my_cur);
! if (my_cur == cas_result) {
! // We succeeded.
! return (void*) my_cur;
} else {
! // We failed. Retry with offending CAS result.
! my_cur = (PaddedEnd<ObjectMonitor>*) cas_result;
}
}
}
bool ParallelObjectSynchronizerIterator::parallel_oops_do(OopClosure* f) {
PaddedEnd<ObjectMonitor>* block = (PaddedEnd<ObjectMonitor>*)claim();
< prev index next >