class RCULock{ private: // Global state Spinlock globalSpin; long globalCounter; // One per processor DEFINE_PER_PROCESSOR( static long, quiescentCount); // Per-lock state Spinlock writerSpin; // Public API omitted } void RCULock::ReadLock() { disableInterrupts(); } void RCULock::ReadUnlock() { enableInterrupts(); } // Called by scheduler void RCULock::QuiescentState(){ memory_barrier(); PER_PROC_VAR(quiescentCount) = globalCounter; memory_barrier(); } void RCULock::writeLock() { writerSpin.acquire(); } void RCULock::writeUnlock() { writerSpin.release(); } void RCULock::publish (void **pp1, void *p2){ memory_barrier(); *pp1 = p2; memory_barrier(); } void RCULock::synchronize() { int p, c; globalSpin.acquire(); c = ++globalCounter; globalSpin.release(); FOREACH_PROCESSOR(p) { while((PER_PROC_VAR( quiescentCount, p) - c) < 0) { // release CPU for 10ms sleep(10); } } }