Author: bonefish Date: 2011-06-06 13:22:48 +0200 (Mon, 06 Jun 2011) New Revision: 41963 Changeset: https://dev.haiku-os.org/changeset/41963 Modified: haiku/branches/developer/bonefish/signals/src/system/kernel/DPC.cpp Log: DPCQueue::Cancel(): Reordered the checks a bit to work correctly also, if the callback is currently executing and already queued again. Modified: haiku/branches/developer/bonefish/signals/src/system/kernel/DPC.cpp =================================================================== --- haiku/branches/developer/bonefish/signals/src/system/kernel/DPC.cpp 2011-06-06 11:17:44 UTC (rev 41962) +++ haiku/branches/developer/bonefish/signals/src/system/kernel/DPC.cpp 2011-06-06 11:22:48 UTC (rev 41963) @@ -214,15 +214,16 @@ { InterruptsSpinLocker locker(fLock); - if (callback != fCallbackInProgress) { - // The callback is not currently being executed. Remove it, if queued. - if (callback->fInQueue != this) - return false; - + // If the callback is queued, remove it. + if (callback->fInQueue == this) { fCallbacks.Remove(callback); return true; } + // The callback is not queued. If it isn't in progress, we're done, too. + if (callback != fCallbackInProgress) + return false; + // The callback is currently being executed. We need to wait for it to be // done.