Exemplo n.º 1
0
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;
}
Exemplo n.º 2
0
/*
 * 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);
}
Exemplo n.º 3
0
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);
}