void SimpleRWLock::LockForRead() { UINT64 oldVal = itsLock; while (((oldVal & NoWriterBitMask) == 0) || !CAS64(&itsLock, oldVal, oldVal-1)) { oldVal = itsLock; } HT_ASSERT(((oldVal-1) & NoWriterBitMask) != 0); }
///////////////////////////////////////////////////////// // EXTERNAL FUNCTIONS ///////////////////////////////////////////////////////// volatile int64_t atomic_add(volatile int64_t * addr, int64_t dx) { volatile int64_t v; for (v = *addr ; CAS64 (addr, v, v+dx) != v; v = *addr) {} return v ; }
RetVal LFUObjectApplyOp(LFUObject *l, LFUObjectThreadState *th_state, RetVal (*sfunc)(Object, ArgVal, int), ArgVal arg, int pid) { RetVal old_val = arg, new_val; reset_backoff(&th_state->backoff); do { old_val = l->val; // val is volatile new_val = sfunc(old_val, arg, pid); if (CAS64(&l->val, old_val, new_val) == true) break; else backoff_delay(&th_state->backoff); } while(true); return old_val; }
void SimpleRWLock::UnLock() { UINT64 oldVal = itsLock; HT_ASSERT(oldVal != Free); if ((oldVal & NoWriterBitMask) == 0) { itsLock = Free; } else { while (!CAS64(&itsLock, oldVal, oldVal+1)) { oldVal = itsLock; HT_ASSERT(oldVal != Free); HT_ASSERT((oldVal & NoWriterBitMask) != 0); } } }
volatile int64_t CAS(volatile int64_t * addr, int64_t expected_value, int64_t new_value) { return CAS64(addr, expected_value, new_value); }
void SimpleRWLock::LockForWrite(UINT64 theThreadId) { while ((itsLock != Free) || !CAS64(&itsLock, Free, theThreadId)) { ; } }