From: Timo Kreuzer Date: Thu, 10 Feb 2011 11:47:17 +0000 (+0000) Subject: [RTL] X-Git-Tag: backups/ros-branch-0_3_13@51035~32 X-Git-Url: https://git.reactos.org/?p=reactos.git;a=commitdiff_plain;h=0d149baf296a709ebd4d88a99eebda2d878ce5f9 [RTL] Merge changes to rtl from cmake branch. Mostly use portable interlocked functions svn path=/trunk/; revision=50648 --- diff --git a/reactos/lib/rtl/actctx.c b/reactos/lib/rtl/actctx.c index eb07758c8cf..a91e1e8a7b1 100644 --- a/reactos/lib/rtl/actctx.c +++ b/reactos/lib/rtl/actctx.c @@ -575,12 +575,12 @@ static ACTIVATION_CONTEXT *check_actctx( HANDLE h ) 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; diff --git a/reactos/lib/rtl/critical.c b/reactos/lib/rtl/critical.c index 2045c0e748c..03bffca4289 100644 --- a/reactos/lib/rtl/critical.c +++ b/reactos/lib/rtl/critical.c @@ -59,15 +59,15 @@ RtlpCreateCriticalSectionSem(PRTL_CRITICAL_SECTION CriticalSection) /* We failed, this is bad... */ DPRINT1("Failed to Create Event!\n"); - _InterlockedDecrement(&CriticalSection->LockCount); + InterlockedDecrement(&CriticalSection->LockCount); RtlRaiseStatus(Status); return; } DPRINT("Created Event: %p \n", hNewEvent); - if (_InterlockedCompareExchangePointer((PVOID*)&CriticalSection->LockSemaphore, - (PVOID)hNewEvent, - 0)) { + if (InterlockedCompareExchangePointer((PVOID*)&CriticalSection->LockSemaphore, + (PVOID)hNewEvent, + 0)) { /* Some just created an event */ DPRINT("Closing already created event: %p\n", hNewEvent); @@ -437,7 +437,7 @@ RtlEnterCriticalSection(PRTL_CRITICAL_SECTION CriticalSection) 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 @@ RtlLeaveCriticalSection(PRTL_CRITICAL_SECTION CriticalSection) 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 @@ RtlLeaveCriticalSection(PRTL_CRITICAL_SECTION CriticalSection) 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 @@ NTAPI RtlTryEnterCriticalSection(PRTL_CRITICAL_SECTION CriticalSection) { /* Try to take control */ - if (_InterlockedCompareExchange(&CriticalSection->LockCount, + if (InterlockedCompareExchange(&CriticalSection->LockCount, 0, -1) == -1) { @@ -674,7 +674,7 @@ RtlTryEnterCriticalSection(PRTL_CRITICAL_SECTION CriticalSection) } else if (CriticalSection->OwningThread == NtCurrentTeb()->ClientId.UniqueThread) { /* It's already ours */ - _InterlockedIncrement(&CriticalSection->LockCount); + InterlockedIncrement(&CriticalSection->LockCount); CriticalSection->RecursionCount++; return TRUE; } diff --git a/reactos/lib/rtl/largeint.c b/reactos/lib/rtl/largeint.c index cc7475241ac..5934f8c8449 100644 --- a/reactos/lib/rtl/largeint.c +++ b/reactos/lib/rtl/largeint.c @@ -14,6 +14,40 @@ /* FUNCTIONS *****************************************************************/ +#undef RtlUlonglongByteSwap +#undef RtlUlongByteSwap +#undef RtlUshortByteSwap + +/* + * @implemented + */ +USHORT +FASTCALL +RtlUshortByteSwap(IN USHORT Source) +{ + return _byteswap_ushort(Source); +} + +/* + * @implemented + */ +ULONG +FASTCALL +RtlUlongByteSwap(IN ULONG Source) +{ + return _byteswap_ulong(Source); +} + +/* + * @implemented + */ +ULONGLONG +FASTCALL +RtlUlonglongByteSwap(IN ULONGLONG Source) +{ + return _byteswap_uint64(Source); +} + /* * @implemented */ diff --git a/reactos/lib/rtl/rtl.h b/reactos/lib/rtl/rtl.h index 3d10deb9338..848ab3d0b04 100644 --- a/reactos/lib/rtl/rtl.h +++ b/reactos/lib/rtl/rtl.h @@ -32,6 +32,17 @@ #include +/* 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 +#define InterlockedExchange _InterlockedExchange +#define InterlockedBitTestAndSet _interlockedbittestandset +#define InterlockedBitTestAndSet64 _interlockedbittestandset64 +#endif + #endif /* RTL_H */ /* EOF */ diff --git a/reactos/lib/rtl/srw.c b/reactos/lib/rtl/srw.c index ff7b755a548..affd558d04c 100644 --- a/reactos/lib/rtl/srw.c +++ b/reactos/lib/rtl/srw.c @@ -131,7 +131,7 @@ RtlpReleaseWaitBlockLockExclusive(IN OUT PRTL_SRWLOCK SRWLock, } } - (void)_InterlockedExchangePointer(&SRWLock->Ptr, (PVOID)NewValue); + (void)InterlockedExchangePointer(&SRWLock->Ptr, (PVOID)NewValue); if (FirstWaitBlock->Exclusive) { @@ -186,7 +186,7 @@ RtlpReleaseWaitBlockLockLastShared(IN OUT PRTL_SRWLOCK SRWLock, NewValue = RTL_SRWLOCK_OWNED; } - (void)_InterlockedExchangePointer(&SRWLock->Ptr, (PVOID)NewValue); + (void)InterlockedExchangePointer(&SRWLock->Ptr, (PVOID)NewValue); (void)InterlockedOr(&FirstWaitBlock->Wake, TRUE); @@ -420,9 +420,9 @@ RtlAcquireSRWLockShared(IN OUT PRTL_SRWLOCK SRWLock) NewValue = (CurrentValue >> RTL_SRWLOCK_BITS) + 1; NewValue = (NewValue << RTL_SRWLOCK_BITS) | (CurrentValue & RTL_SRWLOCK_MASK); - if ((LONG_PTR)_InterlockedCompareExchangePointer(&SRWLock->Ptr, - (PVOID)NewValue, - (PVOID)CurrentValue) == CurrentValue) + if ((LONG_PTR)InterlockedCompareExchangePointer(&SRWLock->Ptr, + (PVOID)NewValue, + (PVOID)CurrentValue) == CurrentValue) { /* Successfully incremented the shared count, we acquired the lock */ break; @@ -499,9 +499,9 @@ RtlAcquireSRWLockShared(IN OUT PRTL_SRWLOCK SRWLock) ASSERT_SRW_WAITBLOCK(&StackWaitBlock); NewValue = (ULONG_PTR)&StackWaitBlock | RTL_SRWLOCK_OWNED | RTL_SRWLOCK_CONTENDED; - if ((LONG_PTR)_InterlockedCompareExchangePointer(&SRWLock->Ptr, - (PVOID)NewValue, - (PVOID)CurrentValue) == CurrentValue) + if ((LONG_PTR)InterlockedCompareExchangePointer(&SRWLock->Ptr, + (PVOID)NewValue, + (PVOID)CurrentValue) == CurrentValue) { RtlpAcquireSRWLockSharedWait(SRWLock, &StackWaitBlock, @@ -521,9 +521,9 @@ RtlAcquireSRWLockShared(IN OUT PRTL_SRWLOCK SRWLock) RTL_SRWLOCK_SHARED nor the RTL_SRWLOCK_OWNED bit is set */ ASSERT(!(CurrentValue & RTL_SRWLOCK_CONTENDED)); - if ((LONG_PTR)_InterlockedCompareExchangePointer(&SRWLock->Ptr, - (PVOID)NewValue, - (PVOID)CurrentValue) == CurrentValue) + if ((LONG_PTR)InterlockedCompareExchangePointer(&SRWLock->Ptr, + (PVOID)NewValue, + (PVOID)CurrentValue) == CurrentValue) { /* Successfully set the shared count, we acquired the lock */ break; @@ -580,9 +580,9 @@ RtlReleaseSRWLockShared(IN OUT PRTL_SRWLOCK SRWLock) NewValue = (NewValue << RTL_SRWLOCK_BITS) | RTL_SRWLOCK_SHARED | RTL_SRWLOCK_OWNED; } - if ((LONG_PTR)_InterlockedCompareExchangePointer(&SRWLock->Ptr, - (PVOID)NewValue, - (PVOID)CurrentValue) == CurrentValue) + if ((LONG_PTR)InterlockedCompareExchangePointer(&SRWLock->Ptr, + (PVOID)NewValue, + (PVOID)CurrentValue) == CurrentValue) { /* Successfully released the lock */ break; @@ -639,9 +639,9 @@ RtlAcquireSRWLockExclusive(IN OUT PRTL_SRWLOCK SRWLock) NewValue = (ULONG_PTR)&StackWaitBlock | RTL_SRWLOCK_SHARED | RTL_SRWLOCK_CONTENDED | RTL_SRWLOCK_OWNED; - if ((LONG_PTR)_InterlockedCompareExchangePointer(&SRWLock->Ptr, - (PVOID)NewValue, - (PVOID)CurrentValue) == CurrentValue) + if ((LONG_PTR)InterlockedCompareExchangePointer(&SRWLock->Ptr, + (PVOID)NewValue, + (PVOID)CurrentValue) == CurrentValue) { RtlpAcquireSRWLockExclusiveWait(SRWLock, &StackWaitBlock); @@ -697,9 +697,9 @@ AddWaitBlock: ASSERT_SRW_WAITBLOCK(&StackWaitBlock); NewValue = (ULONG_PTR)&StackWaitBlock | RTL_SRWLOCK_OWNED | RTL_SRWLOCK_CONTENDED; - if ((LONG_PTR)_InterlockedCompareExchangePointer(&SRWLock->Ptr, - (PVOID)NewValue, - (PVOID)CurrentValue) == CurrentValue) + if ((LONG_PTR)InterlockedCompareExchangePointer(&SRWLock->Ptr, + (PVOID)NewValue, + (PVOID)CurrentValue) == CurrentValue) { RtlpAcquireSRWLockExclusiveWait(SRWLock, &StackWaitBlock); @@ -767,9 +767,9 @@ RtlReleaseSRWLockExclusive(IN OUT PRTL_SRWLOCK SRWLock) ASSERT(!(CurrentValue & ~RTL_SRWLOCK_OWNED)); NewValue = 0; - if ((LONG_PTR)_InterlockedCompareExchangePointer(&SRWLock->Ptr, - (PVOID)NewValue, - (PVOID)CurrentValue) == CurrentValue) + if ((LONG_PTR)InterlockedCompareExchangePointer(&SRWLock->Ptr, + (PVOID)NewValue, + (PVOID)CurrentValue) == CurrentValue) { /* We released the lock */ break; diff --git a/reactos/lib/rtl/timerqueue.c b/reactos/lib/rtl/timerqueue.c index 1cad82fe337..f3e3fcceb73 100644 --- a/reactos/lib/rtl/timerqueue.c +++ b/reactos/lib/rtl/timerqueue.c @@ -372,7 +372,7 @@ static struct timer_queue *get_timer_queue(HANDLE TimerQueue) 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. */ diff --git a/reactos/lib/rtl/vectoreh.c b/reactos/lib/rtl/vectoreh.c index ad10aa5d66e..7bcec181ee7 100644 --- a/reactos/lib/rtl/vectoreh.c +++ b/reactos/lib/rtl/vectoreh.c @@ -61,7 +61,7 @@ RtlCallVectoredExceptionHandlers(IN PEXCEPTION_RECORD ExceptionRecord, if (--veh->Refs == 0) { RemoveEntryList (&veh->ListEntry); - _InterlockedDecrement (&RtlpVectoredExceptionsInstalled); + InterlockedDecrement (&RtlpVectoredExceptionsInstalled); Remove = TRUE; } Ret = TRUE; @@ -74,7 +74,7 @@ RtlCallVectoredExceptionHandlers(IN PEXCEPTION_RECORD ExceptionRecord, { CurrentEntry = veh->ListEntry.Flink; RemoveEntryList (&veh->ListEntry); - _InterlockedDecrement (&RtlpVectoredExceptionsInstalled); + InterlockedDecrement (&RtlpVectoredExceptionsInstalled); RtlLeaveCriticalSection(&RtlpVectoredExceptionLock); RtlFreeHeap(RtlGetProcessHeap(), @@ -136,7 +136,7 @@ RtlAddVectoredExceptionHandler(IN ULONG FirstHandler, InsertTailList(&RtlpVectoredExceptionHead, &veh->ListEntry); } - _InterlockedIncrement (&RtlpVectoredExceptionsInstalled); + InterlockedIncrement (&RtlpVectoredExceptionsInstalled); RtlLeaveCriticalSection(&RtlpVectoredExceptionLock); } @@ -190,4 +190,23 @@ RtlRemoveVectoredExceptionHandler(IN PVOID VectoredHandlerHandle) return Ret; } +PVOID +NTAPI +RtlAddVectoredContinueHandler( + IN ULONG FirstHandler, + IN PVECTORED_EXCEPTION_HANDLER VectoredHandler) +{ + UNIMPLEMENTED; + return NULL; +} + +ULONG +NTAPI +RtlRemoveVectoredContinueHandler( + IN PVOID VectoredHandlerHandle) +{ + UNIMPLEMENTED; + return FALSE; +} + /* EOF */ diff --git a/reactos/lib/rtl/wait.c b/reactos/lib/rtl/wait.c index 543d5a44769..f8254217c8a 100644 --- a/reactos/lib/rtl/wait.c +++ b/reactos/lib/rtl/wait.c @@ -91,7 +91,7 @@ Wait_thread_proc(LPVOID Arg) 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 @@ RtlDeregisterWaitEx(HANDLE WaitHandle, 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 @@ RtlDeregisterWaitEx(HANDLE WaitHandle, } else { - (void)_InterlockedExchangePointer( &Wait->CompletionEvent, CompletionEvent ); + (void)InterlockedExchangePointer( &Wait->CompletionEvent, CompletionEvent ); if (Wait->CallbackInProgress) Status = STATUS_PENDING; @@ -239,7 +239,7 @@ RtlDeregisterWaitEx(HANDLE WaitHandle, Status = STATUS_PENDING; } - if (_InterlockedIncrement( &Wait->DeleteCount ) == 2 ) + if (InterlockedIncrement( &Wait->DeleteCount ) == 2 ) { Status = STATUS_SUCCESS; NtClose( Wait->CancelEvent ); diff --git a/reactos/lib/rtl/workitem.c b/reactos/lib/rtl/workitem.c index 60f313ce56f..c74aea8b48d 100644 --- a/reactos/lib/rtl/workitem.c +++ b/reactos/lib/rtl/workitem.c @@ -55,7 +55,7 @@ RtlpInitializeThreadPool(VOID) do { - InitStatus = _InterlockedCompareExchange(&ThreadPoolInitialized, + InitStatus = InterlockedCompareExchange(&ThreadPoolInitialized, 2, 0); if (InitStatus == 0) @@ -91,7 +91,7 @@ RtlpInitializeThreadPool(VOID) Finish: /* Initialization done */ - _InterlockedExchange(&ThreadPoolInitialized, + InterlockedExchange(&ThreadPoolInitialized, 1); break; } @@ -223,11 +223,11 @@ RtlpExecuteWorkItem(IN OUT PVOID NormalContext, } /* update the requests counter */ - _InterlockedDecrement(&ThreadPoolWorkerThreadsRequests); + InterlockedDecrement(&ThreadPoolWorkerThreadsRequests); if (WorkItem.Flags & WT_EXECUTELONGFUNCTION) { - _InterlockedDecrement(&ThreadPoolWorkerThreadsLongRequests); + InterlockedDecrement(&ThreadPoolWorkerThreadsLongRequests); } } @@ -237,11 +237,11 @@ RtlpQueueWorkerThread(IN OUT PRTLP_WORKITEM WorkItem) { 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 @@ RtlpQueueWorkerThread(IN OUT PRTLP_WORKITEM WorkItem) if (!NT_SUCCESS(Status)) { - _InterlockedDecrement(&ThreadPoolWorkerThreadsRequests); + InterlockedDecrement(&ThreadPoolWorkerThreadsRequests); if (WorkItem->Flags & WT_EXECUTELONGFUNCTION) { - _InterlockedDecrement(&ThreadPoolWorkerThreadsLongRequests); + InterlockedDecrement(&ThreadPoolWorkerThreadsLongRequests); } } @@ -351,11 +351,11 @@ RtlpExecuteIoWorkItem(IN OUT PVOID NormalContext, } /* update the requests counter */ - _InterlockedDecrement(&ThreadPoolIOWorkerThreadsRequests); + InterlockedDecrement(&ThreadPoolIOWorkerThreadsRequests); if (WorkItem.Flags & WT_EXECUTELONGFUNCTION) { - _InterlockedDecrement(&ThreadPoolIOWorkerThreadsLongRequests); + InterlockedDecrement(&ThreadPoolIOWorkerThreadsLongRequests); } } @@ -461,14 +461,14 @@ RtlpQueueIoWorkerThread(IN OUT PRTLP_WORKITEM WorkItem) 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 @@ RtlpQueueIoWorkerThread(IN OUT PRTLP_WORKITEM WorkItem) 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 @@ RtlpIoWorkerThreadProc(IN PVOID Parameter) 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 @@ RtlpIoWorkerThreadProc(IN PVOID Parameter) 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 @@ InitFailed: (PLIST_ENTRY)&ThreadInfo.ListEntry); /* Signal initialization completion */ - _InterlockedExchange((PLONG)Parameter, + InterlockedExchange((PLONG)Parameter, 1); for (;;) @@ -626,7 +626,7 @@ Wait: if (Terminate) { /* Rundown the thread and unlink it from the list */ - _InterlockedDecrement(&ThreadPoolIOWorkerThreads); + InterlockedDecrement(&ThreadPoolIOWorkerThreads); RemoveEntryList((PLIST_ENTRY)&ThreadInfo.ListEntry); } @@ -663,10 +663,10 @@ RtlpWorkerThreadProc(IN PVOID Parameter) 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 @@ RtlpWorkerThreadProc(IN PVOID Parameter) } /* Signal initialization completion */ - _InterlockedExchange((PLONG)Parameter, + InterlockedExchange((PLONG)Parameter, 1); for (;;) @@ -736,7 +736,7 @@ RtlpWorkerThreadProc(IN PVOID Parameter) if (Terminate) { - _InterlockedDecrement(&ThreadPoolWorkerThreads); + InterlockedDecrement(&ThreadPoolWorkerThreads); Status = STATUS_SUCCESS; break; }