#include <windows.h>
#include <winbase.h>
+#include <mono/metadata/handle.h>
+#include <mono/utils/mono-error-internals.h>
void
mono_w32event_init (void)
}
gpointer
-ves_icall_System_Threading_Events_CreateEvent_internal (MonoBoolean manual, MonoBoolean initial, MonoString *name, gint32 *error)
+ves_icall_System_Threading_Events_CreateEvent_internal (MonoBoolean manual, MonoBoolean initial, MonoStringHandle name, gint32 *err, MonoError *error)
{
gpointer event;
- event = CreateEvent (NULL, manual, initial, name ? mono_string_chars (name) : NULL);
-
- *error = GetLastError ();
+ error_init (error);
+
+ 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;
+ event = CreateEvent (NULL, manual, initial, uniname);
+ *err = GetLastError ();
+ MONO_EXIT_GC_SAFE;
+ if (gchandle)
+ mono_gchandle_free (gchandle);
return event;
}
}
gpointer
-ves_icall_System_Threading_Events_OpenEvent_internal (MonoString *name, gint32 rights, gint32 *error)
+ves_icall_System_Threading_Events_OpenEvent_internal (MonoStringHandle name, gint32 rights, gint32 *err, MonoError *error)
{
gpointer handle;
- *error = ERROR_SUCCESS;
+ error_init (error);
+
+ *err = ERROR_SUCCESS;
+
+ uint32_t gchandle = 0;
+ gunichar2 *uniname = NULL;
- handle = OpenEvent (rights, FALSE, mono_string_chars (name));
+ if (!MONO_HANDLE_IS_NULL (name))
+ uniname = mono_string_handle_pin_chars (name, &gchandle);
+
+ MONO_ENTER_GC_SAFE;
+ handle = OpenEvent (rights, FALSE, uniname);
if (!handle)
- *error = GetLastError ();
+ *err = GetLastError ();
+ MONO_EXIT_GC_SAFE;
+
+ if (gchandle)
+ mono_gchandle_free (gchandle);
return handle;
}