linux-packaging-mono/mono/utils/mono-os-semaphore-win32.c
Xamarin Public Jenkins (auto-signing) ef583813eb Imported Upstream version 6.4.0.137
Former-commit-id: 943baa9f16a098c33e129777827f3a9d20da00d6
2019-07-26 19:53:28 +00:00

38 lines
991 B
C

/**
* \file
* MonoOSSemaphore on Win32
*
* Author:
* Ludovic Henry (luhenry@microsoft.com)
*
* Licensed under the MIT license. See LICENSE file in the project root for full license information.
*/
#include "mono-os-semaphore.h"
MonoSemTimedwaitRet
mono_os_sem_timedwait (MonoSemType *sem, guint32 timeout_ms, MonoSemFlags flags)
{
BOOL res;
retry:
res = mono_win32_wait_for_single_object_ex (*sem, timeout_ms, flags & MONO_SEM_FLAGS_ALERTABLE);
if (G_UNLIKELY (res != WAIT_OBJECT_0 && res != WAIT_IO_COMPLETION && res != WAIT_TIMEOUT))
g_error ("%s: mono_win32_wait_for_single_object_ex failed with error %d", __func__, GetLastError ());
if (res == WAIT_IO_COMPLETION && !(flags & MONO_SEM_FLAGS_ALERTABLE))
goto retry;
switch (res) {
case WAIT_OBJECT_0:
return MONO_SEM_TIMEDWAIT_RET_SUCCESS;
case WAIT_IO_COMPLETION:
return MONO_SEM_TIMEDWAIT_RET_ALERTED;
case WAIT_TIMEOUT:
return MONO_SEM_TIMEDWAIT_RET_TIMEDOUT;
default:
g_assert_not_reached ();
}
}