Author: tkreuzer Date: Sun Nov 21 10:05:20 2010 New Revision: 49680
URL: http://svn.reactos.org/svn/reactos?rev=49680&view=rev Log: [RTL] - Use portable interlocked functions in code, define them to intrinsics for x86 and x64 in the header
Modified: branches/cmake-bringup/lib/rtl/actctx.c branches/cmake-bringup/lib/rtl/critical.c branches/cmake-bringup/lib/rtl/rtl.h branches/cmake-bringup/lib/rtl/srw.c branches/cmake-bringup/lib/rtl/timerqueue.c branches/cmake-bringup/lib/rtl/vectoreh.c branches/cmake-bringup/lib/rtl/wait.c branches/cmake-bringup/lib/rtl/workitem.c
Modified: branches/cmake-bringup/lib/rtl/actctx.c URL: http://svn.reactos.org/svn/reactos/branches/cmake-bringup/lib/rtl/actctx.c?r... ============================================================================== --- branches/cmake-bringup/lib/rtl/actctx.c [iso-8859-1] (original) +++ branches/cmake-bringup/lib/rtl/actctx.c [iso-8859-1] Sun Nov 21 10:05:20 2010 @@ -575,12 +575,12 @@
static inline void actctx_addref( ACTIVATION_CONTEXT *actctx ) { - _InterlockedExchangeAdd( &actctx->ref_count, 1 ); + InterlockedExchangeAdd( &actctx->ref_count, 1 ); }
static void actctx_release( ACTIVATION_CONTEXT *actctx ) { - if (_InterlockedExchangeAdd( &actctx->ref_count, -1 ) == 1) + if (InterlockedExchangeAdd( &actctx->ref_count, -1 ) == 1) { unsigned int i, j;
Modified: branches/cmake-bringup/lib/rtl/critical.c URL: http://svn.reactos.org/svn/reactos/branches/cmake-bringup/lib/rtl/critical.c... ============================================================================== --- branches/cmake-bringup/lib/rtl/critical.c [iso-8859-1] (original) +++ branches/cmake-bringup/lib/rtl/critical.c [iso-8859-1] Sun Nov 21 10:05:20 2010 @@ -59,7 +59,7 @@
/* We failed, this is bad... */ DPRINT1("Failed to Create Event!\n"); - _InterlockedDecrement(&CriticalSection->LockCount); + InterlockedDecrement(&CriticalSection->LockCount); RtlRaiseStatus(Status); return; } @@ -437,7 +437,7 @@ HANDLE Thread = (HANDLE)NtCurrentTeb()->ClientId.UniqueThread;
/* Try to Lock it */ - if (_InterlockedIncrement(&CriticalSection->LockCount) != 0) { + if (InterlockedIncrement(&CriticalSection->LockCount) != 0) {
/* * We've failed to lock it! Does this thread @@ -621,7 +621,7 @@ if (--CriticalSection->RecursionCount) {
/* Someone still owns us, but we are free. This needs to be done atomically. */ - _InterlockedDecrement(&CriticalSection->LockCount); + InterlockedDecrement(&CriticalSection->LockCount);
} else {
@@ -630,7 +630,7 @@ CriticalSection->OwningThread = 0;
/* Was someone wanting us? This needs to be done atomically. */ - if (-1 != _InterlockedDecrement(&CriticalSection->LockCount)) { + if (-1 != InterlockedDecrement(&CriticalSection->LockCount)) {
/* Let him have us */ RtlpUnWaitCriticalSection(CriticalSection); @@ -662,7 +662,7 @@ RtlTryEnterCriticalSection(PRTL_CRITICAL_SECTION CriticalSection) { /* Try to take control */ - if (_InterlockedCompareExchange(&CriticalSection->LockCount, + if (InterlockedCompareExchange(&CriticalSection->LockCount, 0, -1) == -1) {
@@ -674,7 +674,7 @@ } else if (CriticalSection->OwningThread == NtCurrentTeb()->ClientId.UniqueThread) {
/* It's already ours */ - _InterlockedIncrement(&CriticalSection->LockCount); + InterlockedIncrement(&CriticalSection->LockCount); CriticalSection->RecursionCount++; return TRUE; }
Modified: branches/cmake-bringup/lib/rtl/rtl.h URL: http://svn.reactos.org/svn/reactos/branches/cmake-bringup/lib/rtl/rtl.h?rev=... ============================================================================== --- branches/cmake-bringup/lib/rtl/rtl.h [iso-8859-1] (original) +++ branches/cmake-bringup/lib/rtl/rtl.h [iso-8859-1] Sun Nov 21 10:05:20 2010 @@ -32,6 +32,14 @@
#include <intrin.h>
+/* Use intrinsics for x86 and x64 */ +#if defined(_M_IX86) || defined(_M_AMD64) +#define InterlockedCompareExchange _InterlockedCompareExchange +#define InterlockedIncrement _InterlockedIncrement +#define InterlockedDecrement _InterlockedDecrement +#define InterlockedExchangeAdd _InterlockedExchangeAdd +#endif + #endif /* RTL_H */
/* EOF */
Modified: branches/cmake-bringup/lib/rtl/srw.c URL: http://svn.reactos.org/svn/reactos/branches/cmake-bringup/lib/rtl/srw.c?rev=... ============================================================================== --- branches/cmake-bringup/lib/rtl/srw.c [iso-8859-1] (original) +++ branches/cmake-bringup/lib/rtl/srw.c [iso-8859-1] Sun Nov 21 10:05:20 2010 @@ -131,7 +131,7 @@ } }
- (void)_InterlockedExchange((PLONG)&SRWLock->Ptr, NewValue); + (void)InterlockedExchange((PLONG)&SRWLock->Ptr, NewValue);
if (FirstWaitBlock->Exclusive) { @@ -186,7 +186,7 @@ NewValue = RTL_SRWLOCK_OWNED; }
- (void)_InterlockedExchange((PLONG)&SRWLock->Ptr, NewValue); + (void)InterlockedExchange((PLONG)&SRWLock->Ptr, NewValue);
(void)InterlockedOr(&FirstWaitBlock->Wake, TRUE); @@ -420,7 +420,7 @@ NewValue = (CurrentValue >> RTL_SRWLOCK_BITS) + 1; NewValue = (NewValue << RTL_SRWLOCK_BITS) | (CurrentValue & RTL_SRWLOCK_MASK);
- if (_InterlockedCompareExchange((PLONG)&SRWLock->Ptr, + if (InterlockedCompareExchange((PLONG)&SRWLock->Ptr, NewValue, CurrentValue) == CurrentValue) { @@ -499,7 +499,7 @@ ASSERT_SRW_WAITBLOCK(&StackWaitBlock);
NewValue = (ULONG_PTR)&StackWaitBlock | RTL_SRWLOCK_OWNED | RTL_SRWLOCK_CONTENDED; - if (_InterlockedCompareExchange((PLONG)&SRWLock->Ptr, + if (InterlockedCompareExchange((PLONG)&SRWLock->Ptr, NewValue, CurrentValue) == CurrentValue) { @@ -521,7 +521,7 @@ RTL_SRWLOCK_SHARED nor the RTL_SRWLOCK_OWNED bit is set */ ASSERT(!(CurrentValue & RTL_SRWLOCK_CONTENDED));
- if (_InterlockedCompareExchange((PLONG)&SRWLock->Ptr, + if (InterlockedCompareExchange((PLONG)&SRWLock->Ptr, NewValue, CurrentValue) == CurrentValue) { @@ -580,7 +580,7 @@ NewValue = (NewValue << RTL_SRWLOCK_BITS) | RTL_SRWLOCK_SHARED | RTL_SRWLOCK_OWNED; }
- if (_InterlockedCompareExchange((PLONG)&SRWLock->Ptr, + if (InterlockedCompareExchange((PLONG)&SRWLock->Ptr, NewValue, CurrentValue) == CurrentValue) { @@ -639,7 +639,7 @@
NewValue = (ULONG_PTR)&StackWaitBlock | RTL_SRWLOCK_SHARED | RTL_SRWLOCK_CONTENDED | RTL_SRWLOCK_OWNED;
- if (_InterlockedCompareExchange((PLONG)&SRWLock->Ptr, + if (InterlockedCompareExchange((PLONG)&SRWLock->Ptr, NewValue, CurrentValue) == CurrentValue) { @@ -697,7 +697,7 @@ ASSERT_SRW_WAITBLOCK(&StackWaitBlock);
NewValue = (ULONG_PTR)&StackWaitBlock | RTL_SRWLOCK_OWNED | RTL_SRWLOCK_CONTENDED; - if (_InterlockedCompareExchange((PLONG)&SRWLock->Ptr, + if (InterlockedCompareExchange((PLONG)&SRWLock->Ptr, NewValue, CurrentValue) == CurrentValue) { @@ -767,7 +767,7 @@ ASSERT(!(CurrentValue & ~RTL_SRWLOCK_OWNED));
NewValue = 0; - if (_InterlockedCompareExchange((PLONG)&SRWLock->Ptr, + if (InterlockedCompareExchange((PLONG)&SRWLock->Ptr, NewValue, CurrentValue) == CurrentValue) {
Modified: branches/cmake-bringup/lib/rtl/timerqueue.c URL: http://svn.reactos.org/svn/reactos/branches/cmake-bringup/lib/rtl/timerqueue... ============================================================================== --- branches/cmake-bringup/lib/rtl/timerqueue.c [iso-8859-1] (original) +++ branches/cmake-bringup/lib/rtl/timerqueue.c [iso-8859-1] Sun Nov 21 10:05:20 2010 @@ -372,7 +372,7 @@ NTSTATUS status = RtlCreateTimerQueue(&q); if (status == STATUS_SUCCESS) { - PVOID p = _InterlockedCompareExchangePointer( + PVOID p = InterlockedCompareExchangePointer( (void **) &default_timer_queue, q, NULL); if (p) /* Got beat to the punch. */
Modified: branches/cmake-bringup/lib/rtl/vectoreh.c URL: http://svn.reactos.org/svn/reactos/branches/cmake-bringup/lib/rtl/vectoreh.c... ============================================================================== --- branches/cmake-bringup/lib/rtl/vectoreh.c [iso-8859-1] (original) +++ branches/cmake-bringup/lib/rtl/vectoreh.c [iso-8859-1] Sun Nov 21 10:05:20 2010 @@ -61,7 +61,7 @@ if (--veh->Refs == 0) { RemoveEntryList (&veh->ListEntry); - _InterlockedDecrement (&RtlpVectoredExceptionsInstalled); + InterlockedDecrement (&RtlpVectoredExceptionsInstalled); Remove = TRUE; } Ret = TRUE; @@ -74,7 +74,7 @@ { CurrentEntry = veh->ListEntry.Flink; RemoveEntryList (&veh->ListEntry); - _InterlockedDecrement (&RtlpVectoredExceptionsInstalled); + InterlockedDecrement (&RtlpVectoredExceptionsInstalled); RtlLeaveCriticalSection(&RtlpVectoredExceptionLock);
RtlFreeHeap(RtlGetProcessHeap(), @@ -136,7 +136,7 @@ InsertTailList(&RtlpVectoredExceptionHead, &veh->ListEntry); } - _InterlockedIncrement (&RtlpVectoredExceptionsInstalled); + InterlockedIncrement (&RtlpVectoredExceptionsInstalled); RtlLeaveCriticalSection(&RtlpVectoredExceptionLock); }
Modified: branches/cmake-bringup/lib/rtl/wait.c URL: http://svn.reactos.org/svn/reactos/branches/cmake-bringup/lib/rtl/wait.c?rev... ============================================================================== --- branches/cmake-bringup/lib/rtl/wait.c [iso-8859-1] (original) +++ branches/cmake-bringup/lib/rtl/wait.c [iso-8859-1] Sun Nov 21 10:05:20 2010 @@ -91,7 +91,7 @@ completion_event = Wait->CompletionEvent; if (completion_event) NtSetEvent( completion_event, NULL );
- if (_InterlockedIncrement( &Wait->DeleteCount ) == 2 ) + if (InterlockedIncrement( &Wait->DeleteCount ) == 2 ) { NtClose( Wait->CancelEvent ); RtlFreeHeap( RtlGetProcessHeap(), 0, Wait ); @@ -220,7 +220,7 @@ if (Status != STATUS_SUCCESS) return Status;
- (void)_InterlockedExchangePointer( &Wait->CompletionEvent, CompletionEvent ); + (void)InterlockedExchangePointer( &Wait->CompletionEvent, CompletionEvent );
if (Wait->CallbackInProgress) NtWaitForSingleObject( CompletionEvent, FALSE, NULL ); @@ -229,7 +229,7 @@ } else { - (void)_InterlockedExchangePointer( &Wait->CompletionEvent, CompletionEvent ); + (void)InterlockedExchangePointer( &Wait->CompletionEvent, CompletionEvent );
if (Wait->CallbackInProgress) Status = STATUS_PENDING; @@ -239,7 +239,7 @@ Status = STATUS_PENDING; }
- if (_InterlockedIncrement( &Wait->DeleteCount ) == 2 ) + if (InterlockedIncrement( &Wait->DeleteCount ) == 2 ) { Status = STATUS_SUCCESS; NtClose( Wait->CancelEvent );
Modified: branches/cmake-bringup/lib/rtl/workitem.c URL: http://svn.reactos.org/svn/reactos/branches/cmake-bringup/lib/rtl/workitem.c... ============================================================================== --- branches/cmake-bringup/lib/rtl/workitem.c [iso-8859-1] (original) +++ branches/cmake-bringup/lib/rtl/workitem.c [iso-8859-1] Sun Nov 21 10:05:20 2010 @@ -55,7 +55,7 @@
do { - InitStatus = _InterlockedCompareExchange(&ThreadPoolInitialized, + InitStatus = InterlockedCompareExchange(&ThreadPoolInitialized, 2, 0); if (InitStatus == 0) @@ -91,7 +91,7 @@
Finish: /* Initialization done */ - _InterlockedExchange(&ThreadPoolInitialized, + InterlockedExchange(&ThreadPoolInitialized, 1); break; } @@ -223,11 +223,11 @@ }
/* update the requests counter */ - _InterlockedDecrement(&ThreadPoolWorkerThreadsRequests); + InterlockedDecrement(&ThreadPoolWorkerThreadsRequests);
if (WorkItem.Flags & WT_EXECUTELONGFUNCTION) { - _InterlockedDecrement(&ThreadPoolWorkerThreadsLongRequests); + InterlockedDecrement(&ThreadPoolWorkerThreadsLongRequests); } }
@@ -237,11 +237,11 @@ { NTSTATUS Status = STATUS_SUCCESS;
- _InterlockedIncrement(&ThreadPoolWorkerThreadsRequests); + InterlockedIncrement(&ThreadPoolWorkerThreadsRequests);
if (WorkItem->Flags & WT_EXECUTELONGFUNCTION) { - _InterlockedIncrement(&ThreadPoolWorkerThreadsLongRequests); + InterlockedIncrement(&ThreadPoolWorkerThreadsLongRequests); }
if (WorkItem->Flags & WT_EXECUTEINPERSISTENTTHREAD) @@ -270,11 +270,11 @@
if (!NT_SUCCESS(Status)) { - _InterlockedDecrement(&ThreadPoolWorkerThreadsRequests); + InterlockedDecrement(&ThreadPoolWorkerThreadsRequests);
if (WorkItem->Flags & WT_EXECUTELONGFUNCTION) { - _InterlockedDecrement(&ThreadPoolWorkerThreadsLongRequests); + InterlockedDecrement(&ThreadPoolWorkerThreadsLongRequests); } }
@@ -351,11 +351,11 @@ }
/* update the requests counter */ - _InterlockedDecrement(&ThreadPoolIOWorkerThreadsRequests); + InterlockedDecrement(&ThreadPoolIOWorkerThreadsRequests);
if (WorkItem.Flags & WT_EXECUTELONGFUNCTION) { - _InterlockedDecrement(&ThreadPoolIOWorkerThreadsLongRequests); + InterlockedDecrement(&ThreadPoolIOWorkerThreadsLongRequests); } }
@@ -461,14 +461,14 @@
ASSERT(IoThread != NULL);
- _InterlockedIncrement(&ThreadPoolIOWorkerThreadsRequests); + InterlockedIncrement(&ThreadPoolIOWorkerThreadsRequests);
if (WorkItem->Flags & WT_EXECUTELONGFUNCTION) { /* We're about to queue a long function, mark the thread */ IoThread->Flags |= WT_EXECUTELONGFUNCTION;
- _InterlockedIncrement(&ThreadPoolIOWorkerThreadsLongRequests); + InterlockedIncrement(&ThreadPoolIOWorkerThreadsLongRequests); }
/* It's time to queue the work item */ @@ -480,11 +480,11 @@ if (!NT_SUCCESS(Status)) { DPRINT1("Failed to queue APC for work item 0x%p\n", WorkItem->Function); - _InterlockedDecrement(&ThreadPoolIOWorkerThreadsRequests); + InterlockedDecrement(&ThreadPoolIOWorkerThreadsRequests);
if (WorkItem->Flags & WT_EXECUTELONGFUNCTION) { - _InterlockedDecrement(&ThreadPoolIOWorkerThreadsLongRequests); + InterlockedDecrement(&ThreadPoolIOWorkerThreadsLongRequests); } }
@@ -543,7 +543,7 @@ BOOLEAN Terminate; NTSTATUS Status = STATUS_SUCCESS;
- if (_InterlockedIncrement(&ThreadPoolIOWorkerThreads) > MAX_WORKERTHREADS) + if (InterlockedIncrement(&ThreadPoolIOWorkerThreads) > MAX_WORKERTHREADS) { /* Oops, too many worker threads... */ goto InitFailed; @@ -562,10 +562,10 @@ DPRINT1("Failed to create handle to own thread! Status: 0x%x\n", Status);
InitFailed: - _InterlockedDecrement(&ThreadPoolIOWorkerThreads); + InterlockedDecrement(&ThreadPoolIOWorkerThreads);
/* Signal initialization completion */ - _InterlockedExchange((PLONG)Parameter, + InterlockedExchange((PLONG)Parameter, 1);
RtlExitUserThread(Status); @@ -579,7 +579,7 @@ (PLIST_ENTRY)&ThreadInfo.ListEntry);
/* Signal initialization completion */ - _InterlockedExchange((PLONG)Parameter, + InterlockedExchange((PLONG)Parameter, 1);
for (;;) @@ -626,7 +626,7 @@ if (Terminate) { /* Rundown the thread and unlink it from the list */ - _InterlockedDecrement(&ThreadPoolIOWorkerThreads); + InterlockedDecrement(&ThreadPoolIOWorkerThreads); RemoveEntryList((PLIST_ENTRY)&ThreadInfo.ListEntry); }
@@ -663,10 +663,10 @@ PKNORMAL_ROUTINE ApcRoutine; NTSTATUS Status = STATUS_SUCCESS;
- if (_InterlockedIncrement(&ThreadPoolWorkerThreads) > MAX_WORKERTHREADS) + if (InterlockedIncrement(&ThreadPoolWorkerThreads) > MAX_WORKERTHREADS) { /* Signal initialization completion */ - _InterlockedExchange((PLONG)Parameter, + InterlockedExchange((PLONG)Parameter, 1);
/* Oops, too many worker threads... */ @@ -675,7 +675,7 @@ }
/* Signal initialization completion */ - _InterlockedExchange((PLONG)Parameter, + InterlockedExchange((PLONG)Parameter, 1);
for (;;) @@ -736,7 +736,7 @@
if (Terminate) { - _InterlockedDecrement(&ThreadPoolWorkerThreads); + InterlockedDecrement(&ThreadPoolWorkerThreads); Status = STATUS_SUCCESS; break; }