void NKern::MoveUserModeCallbacks(NThreadBase* aDestThread, NThreadBase* aSrcThread) { // Move all queued user-mode callbacks from the source thread to the destination thread, and // prevent any more from being queued. Used by the kernel thread code so that callbacks get // cancelled in another thread if the thread they were originally queued on dies. // Atomically remove list of callbacks and set pointer to 1 // The latter ensures any subsequent attempts to add callbacks fail TUserModeCallback* sourceListStart = (TUserModeCallback*)__e32_atomic_swp_ord_ptr(&aSrcThread->iUserModeCallbacks, (TAny*)1); __NK_ASSERT_DEBUG(((TUint)sourceListStart & 3) == 0); // check this only gets called once per thread if (sourceListStart == NULL) return; TUserModeCallback* sourceListEnd = sourceListStart; while (sourceListEnd->iNext != NULL) sourceListEnd = sourceListEnd->iNext; NKern::Lock(); TUserModeCallback* destListStart = aDestThread->iUserModeCallbacks; do { __NK_ASSERT_DEBUG(((TUint)destListStart & 3) == 0); // dest thread must not die sourceListEnd->iNext = destListStart; } while (!__e32_atomic_cas_ord_ptr(&aDestThread->iUserModeCallbacks, &destListStart, sourceListStart)); NKern::Unlock(); }
Q_CORE_EXPORT bool QBasicAtomicPointer_testAndSetOrdered(void * volatile *_q_value, void *expectedValue, void *newValue) { return static_cast<bool>(__e32_atomic_cas_ord_ptr(_q_value, &expectedValue, newValue)); }