void __stdcall Sleep(_In_ DWORD dwMilliseconds) { static HANDLE singletonEvent = nullptr; HANDLE sleepEvent = singletonEvent; // Demand create the event. if (!sleepEvent) { sleepEvent = CreateEventEx(nullptr, nullptr, CREATE_EVENT_MANUAL_RESET, EVENT_ALL_ACCESS); if (!sleepEvent) return; HANDLE previousEvent = InterlockedCompareExchangePointerRelease(&singletonEvent, sleepEvent, nullptr); if (previousEvent) { // Back out if multiple threads try to demand create at the same time. CloseHandle(sleepEvent); sleepEvent = previousEvent; } } // Emulate sleep by waiting with timeout on an event that is never signaled. WaitForSingleObjectEx(sleepEvent, dwMilliseconds, false); return; }
/* * verifyconnect() returns TRUE if the connect really has happened. */ _Use_decl_annotations_ VOID WINAPI CurlSleep(DWORD dwMilliseconds) { static HANDLE singletonEvent = NULL; HANDLE sleepEvent = singletonEvent; HANDLE previousEvent = NULL; // Demand create the event. if (!sleepEvent) { sleepEvent = CreateEventEx(NULL, NULL, CREATE_EVENT_MANUAL_RESET, EVENT_ALL_ACCESS); if (!sleepEvent) return; previousEvent = InterlockedCompareExchangePointerRelease(&singletonEvent, sleepEvent, NULL); if (previousEvent) { // Back out if multiple threads try to demand create at the same time. CloseHandle(sleepEvent); sleepEvent = previousEvent; } } // Emulate sleep by waiting with timeout on an event that is never signalled. WaitForSingleObjectEx(sleepEvent, dwMilliseconds, false); }
FORCEINLINE ULONG_PTR InternalCmpXChgCondVarRel(IN OUT PRTL_CONDITION_VARIABLE ConditionVariable, IN ULONG_PTR Exchange, IN ULONG_PTR Comperand) { return (ULONG_PTR)InterlockedCompareExchangePointerRelease(&ConditionVariable->Ptr, (PVOID)Exchange, (PVOID)Comperand); }