Пример #1
0
void SimpleRWLock::LockForRead() {
  UINT64 oldVal = itsLock;
  while (((oldVal & NoWriterBitMask) == 0) ||
         !CAS64(&itsLock, oldVal, oldVal-1)) {
    oldVal = itsLock;
  }
  HT_ASSERT(((oldVal-1) & NoWriterBitMask) != 0);
}
Пример #2
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;
}
Пример #4
0
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);
    }
  }
}
Пример #5
0
volatile int64_t CAS(volatile int64_t * addr, int64_t expected_value, int64_t new_value) {
	return CAS64(addr, expected_value, new_value);
	
}
Пример #6
0
void SimpleRWLock::LockForWrite(UINT64 theThreadId) {
  while ((itsLock != Free) || !CAS64(&itsLock, Free, theThreadId)) {
    ;
  }
}