From ac4c19f747568348b6b44b4c1ecfa4c240ef1001 Mon Sep 17 00:00:00 2001 From: wj32 Date: Tue, 10 Aug 2010 08:53:17 +0000 Subject: [PATCH] improved PhfSetEvent git-svn-id: svn://svn.code.sf.net/p/processhacker/code@3490 21ef857c-d57f-4fe0-8362-d861dc6d29cd --- 2.x/trunk/phlib/include/phbase.h | 1 + 2.x/trunk/phlib/include/phsync.h | 2 +- 2.x/trunk/phlib/include/queuedlock.h | 2 +- 2.x/trunk/phlib/sync.c | 33 ++++++++++------------------ 4 files changed, 14 insertions(+), 24 deletions(-) diff --git a/2.x/trunk/phlib/include/phbase.h b/2.x/trunk/phlib/include/phbase.h index c4bf84668..b88c28afd 100644 --- a/2.x/trunk/phlib/include/phbase.h +++ b/2.x/trunk/phlib/include/phbase.h @@ -396,6 +396,7 @@ FORCEINLINE VOID PhReleaseMutex( // event #define PH_EVENT_SET 0x1 +#define PH_EVENT_SET_SHIFT 0 #define PH_EVENT_REFCOUNT_SHIFT 1 #define PH_EVENT_REFCOUNT_INC 0x2 diff --git a/2.x/trunk/phlib/include/phsync.h b/2.x/trunk/phlib/include/phsync.h index 59b7a4373..ab592a5ab 100644 --- a/2.x/trunk/phlib/include/phsync.h +++ b/2.x/trunk/phlib/include/phsync.h @@ -98,7 +98,7 @@ FORCEINLINE BOOLEAN PhTryAcquireResourceLockExclusive( __inout PPH_RESOURCE_LOCK Lock ) { - if (!_interlockedbittestandset(&Lock->Value, PH_RESOURCE_LOCK_OWNED_SHIFT)) + if (!_interlockedbittestandset((PLONG)&Lock->Value, PH_RESOURCE_LOCK_OWNED_SHIFT)) { return TRUE; } diff --git a/2.x/trunk/phlib/include/queuedlock.h b/2.x/trunk/phlib/include/queuedlock.h index 46771cdcc..0165bacfe 100644 --- a/2.x/trunk/phlib/include/queuedlock.h +++ b/2.x/trunk/phlib/include/queuedlock.h @@ -209,7 +209,7 @@ FORCEINLINE BOOLEAN PhTryAcquireQueuedLockExclusive( if (!_interlockedbittestandset64((PLONG64)&QueuedLock->Value, PH_QUEUED_LOCK_OWNED_SHIFT)) #endif { - return TRUE; + return TRUE; } else { diff --git a/2.x/trunk/phlib/sync.c b/2.x/trunk/phlib/sync.c index 4d2bee58e..f3580a5d0 100644 --- a/2.x/trunk/phlib/sync.c +++ b/2.x/trunk/phlib/sync.c @@ -71,32 +71,21 @@ VOID FASTCALL PhfSetEvent( __inout PPH_EVENT Event ) { - ULONG value; HANDLE eventHandle; - // Try to set the bit. - do + // Only proceed if the event isn't set already. + if (!_interlockedbittestandset((PLONG)&Event->Value, PH_EVENT_SET_SHIFT)) { - value = Event->Value; + // Do an up-to-date read. + eventHandle = *(volatile HANDLE *)&Event->EventHandle; - // Has the event already been set? - if (value & PH_EVENT_SET) - return; - } while (_InterlockedCompareExchange( - &Event->Value, - value + PH_EVENT_SET, - value - ) != value); + if (eventHandle) + { + NtSetEvent(eventHandle, NULL); + } - // Do an up-to-date read. - eventHandle = *(volatile HANDLE *)(&Event->EventHandle); - - if (eventHandle) - { - NtSetEvent(eventHandle, NULL); + PhpDereferenceEvent(Event); } - - PhpDereferenceEvent(Event); } /** @@ -134,7 +123,7 @@ BOOLEAN FASTCALL PhfWaitForEvent( // Prevent the event from being invalidated. PhpReferenceEvent(Event); - eventHandle = *(volatile HANDLE *)(&Event->EventHandle); + eventHandle = *(volatile HANDLE *)&Event->EventHandle; // Don't bother creating an event if we already have one. if (!eventHandle) @@ -156,7 +145,7 @@ BOOLEAN FASTCALL PhfWaitForEvent( // Essential: check the event one last time to see if // it is set. - if (!(*(volatile ULONG *)(&Event->Value) & PH_EVENT_SET)) + if (!(*(volatile ULONG *)&Event->Value & PH_EVENT_SET)) { result = NtWaitForSingleObject(Event->EventHandle, FALSE, Timeout) == STATUS_WAIT_0; }