[os-event] Make them manual only (#3921)
authorLudovic Henry <ludovic@xamarin.com>
Wed, 9 Nov 2016 19:44:29 +0000 (14:44 -0500)
committerGitHub <noreply@github.com>
Wed, 9 Nov 2016 19:44:29 +0000 (14:44 -0500)
We only use them as manual reset event in the runtime, and that greatly simplifies the code as well as the way they should be used.

mono/metadata/threads.c
mono/utils/mono-threads.c
mono/utils/os-event-unix.c
mono/utils/os-event-win32.c
mono/utils/os-event.h

index ab2da86cb8d2c030623f719d4ff011253bab7e9a..86989d9a25ae5f5fe3a67e4790c820cfb9642bae 100644 (file)
@@ -584,7 +584,7 @@ create_internal_thread_object (void)
        thread->priority = MONO_THREAD_PRIORITY_NORMAL;
 
        thread->suspended = g_new0 (MonoOSEvent, 1);
-       mono_os_event_init (thread->suspended, TRUE, TRUE);
+       mono_os_event_init (thread->suspended, TRUE);
 
        return thread;
 }
@@ -2860,7 +2860,7 @@ void mono_thread_init (MonoThreadStartCB start_cb,
        mono_os_mutex_init_recursive(&interlocked_mutex);
        mono_os_mutex_init_recursive(&joinable_threads_mutex);
        
-       mono_os_event_init (&background_change_event, TRUE, FALSE);
+       mono_os_event_init (&background_change_event, FALSE);
        
        mono_init_static_data_info (&thread_static_info);
        mono_init_static_data_info (&context_static_info);
index d97797e8b68829c5da42b402ae751de6a11cd6e1..5d8696a2ca68f9eeeea948be02b4d6fa9697adc3 100644 (file)
@@ -350,7 +350,7 @@ register_thread (MonoThreadInfo *info, gpointer baseptr)
 
        info->handle = g_new0 (MonoThreadHandle, 1);
        info->handle->ref = 1;
-       mono_os_event_init (&info->handle->event, TRUE, FALSE);
+       mono_os_event_init (&info->handle->event, FALSE);
 
        mono_os_sem_init (&info->resume_semaphore, 0);
 
index 1d437cf62e315844a814eee235e90c3e4acf5475..06e9639d0c2f010959f5d306f7aa46c3f24c78c4 100644 (file)
@@ -27,7 +27,7 @@ initialize (void)
 }
 
 void
-mono_os_event_init (MonoOSEvent *event, gboolean manual, gboolean initial)
+mono_os_event_init (MonoOSEvent *event, gboolean initial)
 {
        g_assert (event);
 
@@ -36,8 +36,6 @@ mono_os_event_init (MonoOSEvent *event, gboolean manual, gboolean initial)
        mono_os_mutex_init (&event->mutex);
        mono_os_cond_init (&event->cond);
        event->signalled = initial;
-       event->manual = manual;
-       event->set_count = (initial && !manual) ? 1 : 0;
 }
 
 void
@@ -57,25 +55,6 @@ mono_os_event_is_signalled (MonoOSEvent *event)
        return event->signalled;
 }
 
-static void
-mono_os_event_signal (MonoOSEvent *event, gboolean broadcast)
-{
-       g_assert (event);
-
-       mono_os_mutex_lock (&signal_mutex);
-
-       event->signalled = TRUE;
-
-       if (broadcast)
-               mono_os_cond_broadcast (&event->cond);
-       else
-               mono_os_cond_signal (&event->cond);
-
-       mono_os_cond_broadcast (&signal_cond);
-
-       mono_os_mutex_unlock (&signal_mutex);
-}
-
 void
 mono_os_event_set (MonoOSEvent *event)
 {
@@ -84,15 +63,15 @@ mono_os_event_set (MonoOSEvent *event)
        g_assert (event);
 
        mono_os_mutex_lock (&event->mutex);
+       mono_os_mutex_lock (&signal_mutex);
 
-       if (event->manual) {
-               mono_os_event_signal (event, TRUE);
-       } else {
-               event->set_count = 1;
-               mono_os_event_signal (event, FALSE);
-       }
+       event->signalled = TRUE;
+
+       mono_os_cond_broadcast (&event->cond);
+       mono_os_cond_broadcast (&signal_cond);
 
        mono_os_mutex_unlock (&event->mutex);
+       mono_os_mutex_unlock (&signal_mutex);
 }
 
 void
@@ -104,33 +83,11 @@ mono_os_event_reset (MonoOSEvent *event)
 
        mono_os_mutex_lock (&event->mutex);
 
-       if (mono_os_event_is_signalled (event))
-               event->signalled = FALSE;
-
-       event->set_count = 0;
+       event->signalled = FALSE;
 
        mono_os_mutex_unlock (&event->mutex);
 }
 
-static gboolean
-mono_os_event_own (MonoOSEvent *event)
-{
-       g_assert (event);
-
-       if (!mono_os_event_is_signalled (event))
-               return FALSE;
-
-       if (!event->manual) {
-               g_assert (event->set_count > 0);
-               event->set_count -= 1;
-
-               if (event->set_count == 0)
-                       mono_os_event_signal (event, FALSE);
-       }
-
-       return TRUE;
-}
-
 MonoOSEventWaitRet
 mono_os_event_wait_one (MonoOSEvent *event, guint32 timeout)
 {
@@ -209,7 +166,7 @@ mono_os_event_wait_multiple (MonoOSEvent **events, gsize nevents, gboolean waita
 
        data = g_new0 (OSEventWaitData, 1);
        data->ref = 2;
-       mono_os_event_init (&data->event, TRUE, FALSE);
+       mono_os_event_init (&data->event, FALSE);
 
        innerevents [nevents ++] = &data->event;
 
@@ -248,11 +205,6 @@ mono_os_event_wait_multiple (MonoOSEvent **events, gsize nevents, gboolean waita
                else /* waitany */
                        signalled = (count > 0);
 
-               if (signalled) {
-                       for (i = 0; i < nevents - 1; ++i)
-                               mono_os_event_own (innerevents [i]);
-               }
-
                mono_os_event_unlock_events (innerevents, nevents);
 
                if (signalled) {
index 422283acf078a0613d7644c4b88e19f744288b45..e28833c0d8f1141623cfe8ccbc41a65787fa83c7 100644 (file)
 #include "atomic.h"
 
 void
-mono_os_event_init (MonoOSEvent *event, gboolean manual, gboolean initial)
+mono_os_event_init (MonoOSEvent *event, gboolean initial)
 {
        g_assert (event);
 
-       event->handle = CreateEvent (NULL, manual, initial, NULL);
+       event->handle = CreateEvent (NULL, TRUE, initial, NULL);
        if (G_UNLIKELY (!event->handle))
                g_error ("%s: CreateEvent failed with error %d", __func__, GetLastError ());
 }
index 81260b983614f0a79063c357ffe34ad618d87044..3f04f0bfcafbbc4554d24431c095928825d80567 100644 (file)
@@ -29,14 +29,12 @@ struct _MonoOSEvent {
 #else
        mono_mutex_t mutex;
        mono_cond_t cond;
-       gboolean manual;
        gboolean signalled;
-       guint32 set_count;
 #endif
 };
 
 void
-mono_os_event_init (MonoOSEvent *event, gboolean manual, gboolean initial);
+mono_os_event_init (MonoOSEvent *event, gboolean initial);
 
 void
 mono_os_event_destroy (MonoOSEvent *event);