Implement WaitHandle.SignalAndWait
authorGonzalo Paniagua Javier <gonzalo.mono@gmail.com>
Fri, 20 Feb 2009 20:17:09 +0000 (20:17 -0000)
committerGonzalo Paniagua Javier <gonzalo.mono@gmail.com>
Fri, 20 Feb 2009 20:17:09 +0000 (20:17 -0000)
Fixes bug #461123.

svn path=/trunk/mono/; revision=127563

mono/io-layer/events.c
mono/metadata/icall-def.h
mono/metadata/threads-types.h
mono/metadata/threads.c

index 40687cbcd4eeb062f299679319ceeb3905f9379c..b55e8e75fbcd8ac88038640532b80587cdf4bc9e 100644 (file)
@@ -96,7 +96,7 @@ static void event_ops_init (void)
 
 static void event_signal(gpointer handle)
 {
-       ResetEvent(handle);
+       SetEvent(handle);
 }
 
 static gboolean event_own (gpointer handle)
@@ -129,7 +129,7 @@ static gboolean event_own (gpointer handle)
 
 static void namedevent_signal (gpointer handle)
 {
-       ResetEvent (handle);
+       SetEvent (handle);
 }
 
 /* NB, always called with the shared handle lock held */
index e1deeb8d2f100f8412a97eaf8428051474a53298..32981f0609a476d1c982ee5b7e3e668f35f44c9f 100644 (file)
@@ -917,9 +917,10 @@ ICALL(THREADP_35, "SetMaxThreads", ves_icall_System_Threading_ThreadPool_SetMaxT
 ICALL(THREADP_4, "SetMinThreads", ves_icall_System_Threading_ThreadPool_SetMinThreads)
 
 ICALL_TYPE(WAITH, "System.Threading.WaitHandle", WAITH_1)
-ICALL(WAITH_1, "WaitAll_internal", ves_icall_System_Threading_WaitHandle_WaitAll_internal)
-ICALL(WAITH_2, "WaitAny_internal", ves_icall_System_Threading_WaitHandle_WaitAny_internal)
-ICALL(WAITH_3, "WaitOne_internal", ves_icall_System_Threading_WaitHandle_WaitOne_internal)
+ICALL(WAITH_1, "SignalAndWait_Internal", ves_icall_System_Threading_WaitHandle_SignalAndWait_Internal)
+ICALL(WAITH_2, "WaitAll_internal", ves_icall_System_Threading_WaitHandle_WaitAll_internal)
+ICALL(WAITH_3, "WaitAny_internal", ves_icall_System_Threading_WaitHandle_WaitAny_internal)
+ICALL(WAITH_4, "WaitOne_internal", ves_icall_System_Threading_WaitHandle_WaitOne_internal)
 
 ICALL_TYPE(TYPE, "System.Type", TYPE_1)
 ICALL(TYPE_1, "EqualsInternal", ves_icall_System_Type_EqualsInternal)
index c635bd5c10957fa3289204a2922ecc8214951c00..061101fe3fcd3f8a8a2acb8ac9380728ced3e980 100644 (file)
@@ -77,6 +77,7 @@ HANDLE ves_icall_System_Threading_Events_OpenEvent_internal (MonoString *name, g
 gboolean ves_icall_System_Threading_WaitHandle_WaitAll_internal(MonoArray *mono_handles, gint32 ms, gboolean exitContext) MONO_INTERNAL;
 gint32 ves_icall_System_Threading_WaitHandle_WaitAny_internal(MonoArray *mono_handles, gint32 ms, gboolean exitContext) MONO_INTERNAL;
 gboolean ves_icall_System_Threading_WaitHandle_WaitOne_internal(MonoObject *this_obj, HANDLE handle, gint32 ms, gboolean exitContext) MONO_INTERNAL;
+gboolean ves_icall_System_Threading_WaitHandle_SignalAndWait_Internal (HANDLE toSignal, HANDLE toWait, gint32 ms, gboolean exitContext) MONO_INTERNAL;
 
 gint32 ves_icall_System_Threading_Interlocked_Increment_Int(gint32 *location) MONO_INTERNAL;
 gint64 ves_icall_System_Threading_Interlocked_Increment_Long(gint64 *location) MONO_INTERNAL;
index 98216d04ad5b03953b775cfea554fdb5312bd5b2..1c35d395b2eae5a6f2b1a47126577244c447e4eb 100644 (file)
@@ -1464,6 +1464,28 @@ gboolean ves_icall_System_Threading_WaitHandle_WaitOne_internal(MonoObject *this
        return(TRUE);
 }
 
+gboolean
+ves_icall_System_Threading_WaitHandle_SignalAndWait_Internal (HANDLE toSignal, HANDLE toWait, gint32 ms, gboolean exitContext)
+{
+       guint32 ret;
+       MonoThread *thread = mono_thread_current ();
+
+       MONO_ARCH_SAVE_REGS;
+
+       if (ms == -1)
+               ms = INFINITE;
+
+       mono_thread_current_check_pending_interrupt ();
+
+       mono_thread_set_state (thread, ThreadState_WaitSleepJoin);
+       
+       ret = SignalObjectAndWait (toSignal, toWait, ms, TRUE);
+       
+       mono_thread_clr_state (thread, ThreadState_WaitSleepJoin);
+
+       return  (!(ret == WAIT_TIMEOUT || ret == WAIT_IO_COMPLETION || ret == WAIT_FAILED));
+}
+
 HANDLE ves_icall_System_Threading_Mutex_CreateMutex_internal (MonoBoolean owned, MonoString *name, MonoBoolean *created)
 { 
        HANDLE mutex;