44 uintx cnt = OrderAccess::load_acquire(thread->get_rcu_counter()); 45 // This checks if the thread's counter is active. And if so is the counter 46 // for a pre-existing reader (belongs to this grace period). A pre-existing 47 // reader will have a lower counter than the global counter version for this 48 // generation. If the counter is larger than the global counter version this 49 // is a new reader and we can continue. 50 if (((cnt & COUNTER_ACTIVE) != 0) && (cnt - _gbl_cnt) > (max_uintx / 2)) { 51 yield.wait(); 52 } else { 53 break; 54 } 55 } 56 } 57 }; 58 59 void GlobalCounter::write_synchronize() { 60 assert((*Thread::current()->get_rcu_counter() & COUNTER_ACTIVE) == 0x0, "must be outside a critcal section"); 61 // Atomic::add must provide fence since we have storeload dependency. 62 volatile uintx gbl_cnt = Atomic::add((uintx)COUNTER_INCREMENT, &_global_counter._counter, 63 memory_order_conservative); 64 // Do all RCU threads. 65 CounterThreadCheck ctc(gbl_cnt); 66 for (JavaThreadIteratorWithHandle jtiwh; JavaThread *thread = jtiwh.next(); ) { 67 ctc.do_thread(thread); 68 } 69 ctc.do_thread(VMThread::vm_thread()); 70 } | 44 uintx cnt = OrderAccess::load_acquire(thread->get_rcu_counter()); 45 // This checks if the thread's counter is active. And if so is the counter 46 // for a pre-existing reader (belongs to this grace period). A pre-existing 47 // reader will have a lower counter than the global counter version for this 48 // generation. If the counter is larger than the global counter version this 49 // is a new reader and we can continue. 50 if (((cnt & COUNTER_ACTIVE) != 0) && (cnt - _gbl_cnt) > (max_uintx / 2)) { 51 yield.wait(); 52 } else { 53 break; 54 } 55 } 56 } 57 }; 58 59 void GlobalCounter::write_synchronize() { 60 assert((*Thread::current()->get_rcu_counter() & COUNTER_ACTIVE) == 0x0, "must be outside a critcal section"); 61 // Atomic::add must provide fence since we have storeload dependency. 62 volatile uintx gbl_cnt = Atomic::add((uintx)COUNTER_INCREMENT, &_global_counter._counter, 63 memory_order_conservative); 64 // Handle bootstrap 65 if (Threads::number_of_threads() == 0) { 66 return; 67 } 68 69 // Do all RCU threads. 70 CounterThreadCheck ctc(gbl_cnt); 71 for (JavaThreadIteratorWithHandle jtiwh; JavaThread *thread = jtiwh.next(); ) { 72 ctc.do_thread(thread); 73 } 74 ctc.do_thread(VMThread::vm_thread()); 75 } |