From 3b49a83fea161095a0506928fa91bc43b46a337d Mon Sep 17 00:00:00 2001 From: wj32 Date: Wed, 24 Feb 2010 11:14:53 +0000 Subject: [PATCH] use Fast variant of queued lock functions more git-svn-id: svn://svn.code.sf.net/p/processhacker/code@2877 21ef857c-d57f-4fe0-8362-d861dc6d29cd --- 2.x/trunk/ProcessHacker/basesup.c | 16 ++++++------- 2.x/trunk/ProcessHacker/include/queuedlock.h | 7 +++--- 2.x/trunk/ProcessHacker/provider.c | 24 ++++++++++---------- 2.x/trunk/ProcessHacker/queuedlock.c | 3 +++ 2.x/trunk/ProcessHacker/workqueue.c | 20 ++++++++-------- 5 files changed, 36 insertions(+), 34 deletions(-) diff --git a/2.x/trunk/ProcessHacker/basesup.c b/2.x/trunk/ProcessHacker/basesup.c index 5641107cd..d6e441c36 100644 --- a/2.x/trunk/ProcessHacker/basesup.c +++ b/2.x/trunk/ProcessHacker/basesup.c @@ -2678,9 +2678,9 @@ VOID PhRegisterCallbackEx( Registration->Unregistering = FALSE; Registration->Flags = Flags; - PhAcquireQueuedLockExclusive(&Callback->ListLock); + PhAcquireQueuedLockExclusiveFast(&Callback->ListLock); InsertTailList(&Callback->ListHead, &Registration->ListEntry); - PhReleaseQueuedLockExclusive(&Callback->ListLock); + PhReleaseQueuedLockExclusiveFast(&Callback->ListLock); } /** @@ -2704,9 +2704,9 @@ VOID PhUnregisterCallback( { Registration->Unregistering = TRUE; - PhAcquireQueuedLockExclusive(&Callback->ListLock); + PhAcquireQueuedLockExclusiveFast(&Callback->ListLock); RemoveEntryList(&Registration->ListEntry); - PhReleaseQueuedLockExclusive(&Callback->ListLock); + PhReleaseQueuedLockExclusiveFast(&Callback->ListLock); } /** @@ -2723,7 +2723,7 @@ VOID PhInvokeCallback( { PLIST_ENTRY listEntry; - PhAcquireQueuedLockShared(&Callback->ListLock); + PhAcquireQueuedLockSharedFast(&Callback->ListLock); listEntry = Callback->ListHead.Flink; @@ -2750,7 +2750,7 @@ VOID PhInvokeCallback( // and dereference the object when unregistering a provider. if (!(registration->Flags & PH_CALLBACK_SYNC_WITH_UNREGISTER)) - PhReleaseQueuedLockShared(&Callback->ListLock); + PhReleaseQueuedLockSharedFast(&Callback->ListLock); registration->Function( Parameter, @@ -2758,10 +2758,10 @@ VOID PhInvokeCallback( ); if (!(registration->Flags & PH_CALLBACK_SYNC_WITH_UNREGISTER)) - PhAcquireQueuedLockShared(&Callback->ListLock); + PhAcquireQueuedLockSharedFast(&Callback->ListLock); } - PhReleaseQueuedLockShared(&Callback->ListLock); + PhReleaseQueuedLockSharedFast(&Callback->ListLock); } /** diff --git a/2.x/trunk/ProcessHacker/include/queuedlock.h b/2.x/trunk/ProcessHacker/include/queuedlock.h index 32d151764..24797bd6b 100644 --- a/2.x/trunk/ProcessHacker/include/queuedlock.h +++ b/2.x/trunk/ProcessHacker/include/queuedlock.h @@ -149,10 +149,9 @@ FORCEINLINE VOID PhReleaseQueuedLockExclusiveFast( value = (ULONG_PTR)_InterlockedExchangeAdd64((PLONG64)&QueuedLock->Value, -(LONG64)PH_QUEUED_LOCK_OWNED); #endif - if ( - (value & PH_QUEUED_LOCK_WAITERS) && - !(value & PH_QUEUED_LOCK_TRAVERSING) - ) + // Only check for waiters here, not the traversing bit, since + // that isn't common. + if (value & PH_QUEUED_LOCK_WAITERS) { PhTryWakePushLock(QueuedLock); } diff --git a/2.x/trunk/ProcessHacker/provider.c b/2.x/trunk/ProcessHacker/provider.c index 33cbc5bbf..12b562eb3 100644 --- a/2.x/trunk/ProcessHacker/provider.c +++ b/2.x/trunk/ProcessHacker/provider.c @@ -88,7 +88,7 @@ NTSTATUS NTAPI PhpProviderThreadStart( InitializeListHead(&tempListHead); - PhAcquireQueuedLockExclusive(&providerThread->Lock); + PhAcquireQueuedLockExclusiveFast(&providerThread->Lock); // Main loop. @@ -125,8 +125,8 @@ NTSTATUS NTAPI PhpProviderThreadStart( if (registration->Unregistering) { - PhReleaseQueuedLockExclusive(&providerThread->Lock); - PhAcquireQueuedLockExclusive(&providerThread->Lock); + PhReleaseQueuedLockExclusiveFast(&providerThread->Lock); + PhAcquireQueuedLockExclusiveFast(&providerThread->Lock); continue; } @@ -143,9 +143,9 @@ NTSTATUS NTAPI PhpProviderThreadStart( if (object) PhReferenceObject(object); - PhReleaseQueuedLockExclusive(&providerThread->Lock); + PhReleaseQueuedLockExclusiveFast(&providerThread->Lock); registration->Function(registration->Object); - PhAcquireQueuedLockExclusive(&providerThread->Lock); + PhAcquireQueuedLockExclusiveFast(&providerThread->Lock); if (object) PhDereferenceObject(object); @@ -156,7 +156,7 @@ NTSTATUS NTAPI PhpProviderThreadStart( while ((listEntry = RemoveHeadList(&tempListHead)) != &tempListHead) InsertTailList(&providerThread->ListHead, listEntry); - PhReleaseQueuedLockExclusive(&providerThread->Lock); + PhReleaseQueuedLockExclusiveFast(&providerThread->Lock); // Perform an alertable wait so we can be woken up by // someone telling us to terminate. @@ -246,7 +246,7 @@ VOID PhBoostProvider( // Simply move to the provider to the front of the list. // This works even if the provider is currently in the temp list. - PhAcquireQueuedLockExclusive(&ProviderThread->Lock); + PhAcquireQueuedLockExclusiveFast(&ProviderThread->Lock); RemoveEntryList(&Registration->ListEntry); InsertHeadList(&ProviderThread->ListHead, &Registration->ListEntry); @@ -254,7 +254,7 @@ VOID PhBoostProvider( Registration->Boosting = TRUE; ProviderThread->BoostCount++; - PhReleaseQueuedLockExclusive(&ProviderThread->Lock); + PhReleaseQueuedLockExclusiveFast(&ProviderThread->Lock); // Wake up the thread. NtAlertThread(ProviderThread->ThreadHandle); @@ -284,9 +284,9 @@ VOID PhRegisterProvider( if (Object) PhReferenceObject(Object); - PhAcquireQueuedLockExclusive(&ProviderThread->Lock); + PhAcquireQueuedLockExclusiveFast(&ProviderThread->Lock); InsertTailList(&ProviderThread->ListHead, &Registration->ListEntry); - PhReleaseQueuedLockExclusive(&ProviderThread->Lock); + PhReleaseQueuedLockExclusiveFast(&ProviderThread->Lock); } VOID PhUnregisterProvider( @@ -304,7 +304,7 @@ VOID PhUnregisterProvider( // will be removed from the temp list and so // it won't be re-added to the main list. - PhAcquireQueuedLockExclusive(&ProviderThread->Lock); + PhAcquireQueuedLockExclusiveFast(&ProviderThread->Lock); RemoveEntryList(&Registration->ListEntry); @@ -317,5 +317,5 @@ VOID PhUnregisterProvider( if (Registration->Object) PhDereferenceObject(Registration->Object); - PhReleaseQueuedLockExclusive(&ProviderThread->Lock); + PhReleaseQueuedLockExclusiveFast(&ProviderThread->Lock); } diff --git a/2.x/trunk/ProcessHacker/queuedlock.c b/2.x/trunk/ProcessHacker/queuedlock.c index 334186cd2..4442c652c 100644 --- a/2.x/trunk/ProcessHacker/queuedlock.c +++ b/2.x/trunk/ProcessHacker/queuedlock.c @@ -21,6 +21,9 @@ */ /* + * Queued lock, a.k.a. push lock (kernel-mode) or slim reader-writer lock + * (user-mode). + * * The queued lock is: * * Around 10% faster than the fast lock. * * Only the size of a pointer. diff --git a/2.x/trunk/ProcessHacker/workqueue.c b/2.x/trunk/ProcessHacker/workqueue.c index b613568b3..a3cc1d12f 100644 --- a/2.x/trunk/ProcessHacker/workqueue.c +++ b/2.x/trunk/ProcessHacker/workqueue.c @@ -148,7 +148,7 @@ NTSTATUS PhpWorkQueueThreadStart( BOOLEAN terminate = FALSE; // Lock and re-check. - PhAcquireQueuedLockExclusive(&workQueue->StateLock); + PhAcquireQueuedLockExclusiveFast(&workQueue->StateLock); // Check the minimum as well. if ( @@ -160,7 +160,7 @@ NTSTATUS PhpWorkQueueThreadStart( terminate = TRUE; } - PhReleaseQueuedLockExclusive(&workQueue->StateLock); + PhReleaseQueuedLockExclusiveFast(&workQueue->StateLock); if (terminate) break; @@ -172,9 +172,9 @@ NTSTATUS PhpWorkQueueThreadStart( if (workQueue->Terminating) { // The work queue is being deleted. - PhAcquireQueuedLockExclusive(&workQueue->StateLock); + PhAcquireQueuedLockExclusiveFast(&workQueue->StateLock); workQueue->CurrentThreads--; - PhReleaseQueuedLockExclusive(&workQueue->StateLock); + PhReleaseQueuedLockExclusiveFast(&workQueue->StateLock); break; } @@ -182,9 +182,9 @@ NTSTATUS PhpWorkQueueThreadStart( if (result == WAIT_OBJECT_0) { // Dequeue the work item. - PhAcquireQueuedLockExclusive(&workQueue->QueueLock); + PhAcquireQueuedLockExclusiveFast(&workQueue->QueueLock); PhDequeueQueueItem(workQueue->Queue, &workQueueItem); - PhReleaseQueuedLockExclusive(&workQueue->QueueLock); + PhReleaseQueuedLockExclusiveFast(&workQueue->QueueLock); // Make sure we got work. if (workQueueItem) @@ -203,7 +203,7 @@ NTSTATUS PhpWorkQueueThreadStart( // No work arrived before the timeout passed (or some error occurred). // Terminate the thread. - PhAcquireQueuedLockExclusive(&workQueue->StateLock); + PhAcquireQueuedLockExclusiveFast(&workQueue->StateLock); // Check the minimum. if (workQueue->CurrentThreads > workQueue->MinimumThreads) @@ -212,7 +212,7 @@ NTSTATUS PhpWorkQueueThreadStart( terminate = TRUE; } - PhReleaseQueuedLockExclusive(&workQueue->StateLock); + PhReleaseQueuedLockExclusiveFast(&workQueue->StateLock); if (terminate) break; @@ -250,14 +250,14 @@ VOID PhQueueWorkQueueItem( ) { // Lock and re-check. - PhAcquireQueuedLockExclusive(&WorkQueue->StateLock); + PhAcquireQueuedLockExclusiveFast(&WorkQueue->StateLock); if (WorkQueue->CurrentThreads < WorkQueue->MaximumThreads) { PhpCreateWorkQueueThread(WorkQueue); } - PhReleaseQueuedLockExclusive(&WorkQueue->StateLock); + PhReleaseQueuedLockExclusiveFast(&WorkQueue->StateLock); } }