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
This commit is contained in:
wj32
2010-02-24 11:14:53 +00:00
parent ca13611c59
commit 3b49a83fea
5 changed files with 36 additions and 34 deletions
+8 -8
View File
@@ -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);
}
/**
+3 -4
View File
@@ -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);
}
+12 -12
View File
@@ -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);
}
+3
View File
@@ -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.
+10 -10
View File
@@ -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);
}
}