< prev index next >
src/share/vm/runtime/synchronizer.cpp
Print this page
rev 13331 : Simplify parallel synchronizer roots iterator.
@@ -128,11 +128,10 @@
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
@@ -1946,21 +1945,19 @@
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;
- }
+ 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 {
- assert(my_cur->object() == CLAIMEDMARKER, "Must be");
+ // We failed. Retry with offending CAS result.
+ my_cur = (PaddedEnd<ObjectMonitor>*) cas_result;
}
-
- 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();
< prev index next >