mirror of
https://github.com/mirror/processhacker
synced 2026-06-08 16:03:24 +00:00
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:
@@ -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);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user