/** * \file * Runtime support for managed Mutex 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 "w32mutex.h" #include #include #include #include void mono_w32mutex_init (void) { } gpointer ves_icall_System_Threading_Mutex_CreateMutex_internal (MonoBoolean owned, MonoStringHandle name, MonoBoolean *created, MonoError *error) { HANDLE mutex; error_init (error); *created = TRUE; if (MONO_HANDLE_IS_NULL (name)) { MONO_ENTER_GC_SAFE; mutex = CreateMutex (NULL, owned, NULL); MONO_EXIT_GC_SAFE; } else { uint32_t gchandle; gunichar2 *uniname = mono_string_handle_pin_chars (name, &gchandle); MONO_ENTER_GC_SAFE; mutex = CreateMutex (NULL, owned, uniname); if (GetLastError () == ERROR_ALREADY_EXISTS) *created = FALSE; MONO_EXIT_GC_SAFE; mono_gchandle_free (gchandle); } return mutex; } MonoBoolean ves_icall_System_Threading_Mutex_ReleaseMutex_internal (gpointer handle) { return ReleaseMutex (handle); } gpointer ves_icall_System_Threading_Mutex_OpenMutex_internal (MonoStringHandle name, gint32 rights, gint32 *err, MonoError *error) { HANDLE ret; error_init (error); *err = ERROR_SUCCESS; uint32_t gchandle = 0; gunichar2 *uniname = NULL; if (!MONO_HANDLE_IS_NULL (name)) uniname = mono_string_handle_pin_chars (name, &gchandle); MONO_ENTER_GC_SAFE; ret = OpenMutex (rights, FALSE, uniname); if (!ret) *err = GetLastError (); MONO_EXIT_GC_SAFE; if (gchandle != 0) mono_gchandle_free (gchandle); return ret; }