From d46d59e019fc14bb9dab08a0cc2aa117470d1895 Mon Sep 17 00:00:00 2001 From: Ludovic Henry Date: Wed, 8 Feb 2017 10:33:22 -0500 Subject: [PATCH] Revert "[threads] Make OSEvent alertable to fix bug #51653" (#4346) --- mono/metadata/icall.c | 4 +++ mono/metadata/threads.c | 2 +- mono/utils/mono-threads.c | 4 +-- mono/utils/os-event-unix.c | 54 +++++++++++++++++-------------------- mono/utils/os-event-win32.c | 10 +++---- mono/utils/os-event.h | 4 +-- 6 files changed, 38 insertions(+), 40 deletions(-) diff --git a/mono/metadata/icall.c b/mono/metadata/icall.c index 9468d64d9dc..890e7155bee 100644 --- a/mono/metadata/icall.c +++ b/mono/metadata/icall.c @@ -6646,6 +6646,10 @@ ves_icall_System_Environment_Exit (int result) /* Suspend all managed threads since the runtime is going away */ mono_thread_suspend_all_other_threads (); + //FIXME shutdown is, weirdly enough, abortible in gc.c so we add this hack for now, see https://bugzilla.xamarin.com/show_bug.cgi?id=51653 + mono_threads_begin_abort_protected_block (); + mono_thread_info_clear_self_interrupt (); + mono_runtime_quit (); #endif diff --git a/mono/metadata/threads.c b/mono/metadata/threads.c index 404a29f56db..b94a4ff7ff3 100644 --- a/mono/metadata/threads.c +++ b/mono/metadata/threads.c @@ -5002,7 +5002,7 @@ self_suspend_internal (void) event = thread->suspended; MONO_ENTER_GC_SAFE; - res = mono_os_event_wait_one (event, MONO_INFINITE_WAIT, TRUE); + res = mono_os_event_wait_one (event, MONO_INFINITE_WAIT); g_assert (res == MONO_OS_EVENT_WAIT_RET_SUCCESS_0 || res == MONO_OS_EVENT_WAIT_RET_ALERTED); MONO_EXIT_GC_SAFE; } diff --git a/mono/utils/mono-threads.c b/mono/utils/mono-threads.c index b0e98d43f28..5f719c161e3 100644 --- a/mono/utils/mono-threads.c +++ b/mono/utils/mono-threads.c @@ -1655,7 +1655,7 @@ mono_thread_info_wait_one_handle (MonoThreadHandle *thread_handle, guint32 timeo { MonoOSEventWaitRet res; - res = mono_os_event_wait_one (&thread_handle->event, timeout, alertable); + res = mono_os_event_wait_one (&thread_handle->event, timeout); if (res == MONO_OS_EVENT_WAIT_RET_SUCCESS_0) return MONO_THREAD_INFO_WAIT_RET_SUCCESS_0; else if (res == MONO_OS_EVENT_WAIT_RET_ALERTED) @@ -1683,7 +1683,7 @@ mono_thread_info_wait_multiple_handle (MonoThreadHandle **thread_handles, gsize if (background_change_event) thread_events [nhandles ++] = background_change_event; - res = mono_os_event_wait_multiple (thread_events, nhandles, waitall, timeout, alertable); + res = mono_os_event_wait_multiple (thread_events, nhandles, waitall, timeout); if (res >= MONO_OS_EVENT_WAIT_RET_SUCCESS_0 && res <= MONO_OS_EVENT_WAIT_RET_SUCCESS_0 + nhandles - 1) return MONO_THREAD_INFO_WAIT_RET_SUCCESS_0 + (res - MONO_OS_EVENT_WAIT_RET_SUCCESS_0); else if (res == MONO_OS_EVENT_WAIT_RET_ALERTED) diff --git a/mono/utils/os-event-unix.c b/mono/utils/os-event-unix.c index b4a3e2f5afd..611cb76ffbc 100644 --- a/mono/utils/os-event-unix.c +++ b/mono/utils/os-event-unix.c @@ -88,9 +88,9 @@ mono_os_event_reset (MonoOSEvent *event) } MonoOSEventWaitRet -mono_os_event_wait_one (MonoOSEvent *event, guint32 timeout, gboolean alertable) +mono_os_event_wait_one (MonoOSEvent *event, guint32 timeout) { - return mono_os_event_wait_multiple (&event, 1, TRUE, timeout, alertable); + return mono_os_event_wait_multiple (&event, 1, TRUE, timeout); } typedef struct { @@ -113,7 +113,7 @@ signal_and_unref (gpointer user_data) } MonoOSEventWaitRet -mono_os_event_wait_multiple (MonoOSEvent **events, gsize nevents, gboolean waitall, guint32 timeout, gboolean alertable) +mono_os_event_wait_multiple (MonoOSEvent **events, gsize nevents, gboolean waitall, guint32 timeout) { MonoOSEventWaitRet ret; mono_cond_t signal_cond; @@ -131,18 +131,16 @@ mono_os_event_wait_multiple (MonoOSEvent **events, gsize nevents, gboolean waita for (i = 0; i < nevents; ++i) g_assert (events [i]); - if (alertable) { - data = g_new0 (OSEventWaitData, 1); - data->ref = 2; - mono_os_event_init (&data->event, FALSE); + data = g_new0 (OSEventWaitData, 1); + data->ref = 2; + mono_os_event_init (&data->event, FALSE); - alerted = FALSE; - mono_thread_info_install_interrupt (signal_and_unref, data, &alerted); - if (alerted) { - mono_os_event_destroy (&data->event); - g_free (data); - return MONO_OS_EVENT_WAIT_RET_ALERTED; - } + alerted = FALSE; + mono_thread_info_install_interrupt (signal_and_unref, data, &alerted); + if (alerted) { + mono_os_event_destroy (&data->event); + g_free (data); + return MONO_OS_EVENT_WAIT_RET_ALERTED; } if (timeout != MONO_INFINITE_WAIT) @@ -155,8 +153,7 @@ mono_os_event_wait_multiple (MonoOSEvent **events, gsize nevents, gboolean waita for (i = 0; i < nevents; ++i) g_ptr_array_add (events [i]->conds, &signal_cond); - if (alertable) - g_ptr_array_add (data->event.conds, &signal_cond); + g_ptr_array_add (data->event.conds, &signal_cond); for (;;) { gint count, lowest; @@ -173,7 +170,7 @@ mono_os_event_wait_multiple (MonoOSEvent **events, gsize nevents, gboolean waita } } - if (alertable && mono_os_event_is_signalled (&data->event)) + if (mono_os_event_is_signalled (&data->event)) signalled = TRUE; else if (waitall) signalled = (count == nevents); @@ -209,26 +206,23 @@ done: for (i = 0; i < nevents; ++i) g_ptr_array_remove (events [i]->conds, &signal_cond); - if (alertable) - g_ptr_array_remove (data->event.conds, &signal_cond); + g_ptr_array_remove (data->event.conds, &signal_cond); mono_os_mutex_unlock (&signal_mutex); mono_os_cond_destroy (&signal_cond); - if (alertable) { - mono_thread_info_uninstall_interrupt (&alerted); - if (alerted) { - if (InterlockedDecrement ((gint32*) &data->ref) == 0) { - mono_os_event_destroy (&data->event); - g_free (data); - } - return MONO_OS_EVENT_WAIT_RET_ALERTED; + mono_thread_info_uninstall_interrupt (&alerted); + if (alerted) { + if (InterlockedDecrement ((gint32*) &data->ref) == 0) { + mono_os_event_destroy (&data->event); + g_free (data); } - - mono_os_event_destroy (&data->event); - g_free (data); + return MONO_OS_EVENT_WAIT_RET_ALERTED; } + mono_os_event_destroy (&data->event); + g_free (data); + return ret; } diff --git a/mono/utils/os-event-win32.c b/mono/utils/os-event-win32.c index 33fb867d654..e28833c0d8f 100644 --- a/mono/utils/os-event-win32.c +++ b/mono/utils/os-event-win32.c @@ -64,14 +64,14 @@ mono_os_event_reset (MonoOSEvent *event) } MonoOSEventWaitRet -mono_os_event_wait_one (MonoOSEvent *event, guint32 timeout, gboolean alertable) +mono_os_event_wait_one (MonoOSEvent *event, guint32 timeout) { DWORD res; g_assert (event); g_assert (event->handle); - res = WaitForSingleObjectEx (event->handle, timeout, alertable); + res = WaitForSingleObjectEx (event->handle, timeout, TRUE); if (res == WAIT_OBJECT_0) return MONO_OS_EVENT_WAIT_RET_SUCCESS_0; else if (res == WAIT_IO_COMPLETION) @@ -85,7 +85,7 @@ mono_os_event_wait_one (MonoOSEvent *event, guint32 timeout, gboolean alertable) } MonoOSEventWaitRet -mono_os_event_wait_multiple (MonoOSEvent **events, gsize nevents, gboolean waitall, guint32 timeout, gboolean alertable) +mono_os_event_wait_multiple (MonoOSEvent **events, gsize nevents, gboolean waitall, guint32 timeout) { DWORD res; gpointer handles [MONO_OS_EVENT_WAIT_MAXIMUM_OBJECTS]; @@ -96,7 +96,7 @@ mono_os_event_wait_multiple (MonoOSEvent **events, gsize nevents, gboolean waita g_assert (nevents <= MONO_OS_EVENT_WAIT_MAXIMUM_OBJECTS); if (nevents == 1) - return mono_os_event_wait_one (events [0], timeout, alertable); + return mono_os_event_wait_one (events [0], timeout); for (i = 0; i < nevents; ++i) { g_assert (events [i]); @@ -104,7 +104,7 @@ mono_os_event_wait_multiple (MonoOSEvent **events, gsize nevents, gboolean waita handles [i] = events [i]->handle; } - res = WaitForMultipleObjectsEx (nevents, handles, waitall, timeout, alertable); + res = WaitForMultipleObjectsEx (nevents, handles, waitall, timeout, TRUE); if (res >= WAIT_OBJECT_0 && res < WAIT_OBJECT_0 + MONO_OS_EVENT_WAIT_MAXIMUM_OBJECTS) return MONO_OS_EVENT_WAIT_RET_SUCCESS_0 + (res - WAIT_OBJECT_0); else if (res == WAIT_IO_COMPLETION) diff --git a/mono/utils/os-event.h b/mono/utils/os-event.h index 280b19ad8ac..c3ca11b8504 100644 --- a/mono/utils/os-event.h +++ b/mono/utils/os-event.h @@ -45,9 +45,9 @@ void mono_os_event_reset (MonoOSEvent *event); MonoOSEventWaitRet -mono_os_event_wait_one (MonoOSEvent *event, guint32 timeout, gboolean alertable); +mono_os_event_wait_one (MonoOSEvent *event, guint32 timeout); MonoOSEventWaitRet -mono_os_event_wait_multiple (MonoOSEvent **events, gsize nevents, gboolean waitall, guint32 timeout, gboolean alertable); +mono_os_event_wait_multiple (MonoOSEvent **events, gsize nevents, gboolean waitall, guint32 timeout); #endif /* _MONO_UTILS_OS_EVENT_H_ */ -- 2.25.1