< 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 >