void mono_os_event_set (MonoOSEvent *event) { gsize i; g_assert (mono_lazy_is_initialized (&status)); g_assert (event); mono_os_mutex_lock (&signal_mutex); event->signalled = TRUE; for (i = 0; i < event->conds->len; ++i) mono_os_cond_signal ((mono_cond_t*) event->conds->pdata [i]); mono_os_mutex_unlock (&signal_mutex); }
void mono_w32handle_set_signal_state (gpointer handle, gboolean state, gboolean broadcast) { MonoW32HandleBase *handle_data; if (!mono_w32handle_lookup_data (handle, &handle_data)) { return; } #ifdef DEBUG g_message ("%s: setting state of %p to %s (broadcast %s)", __func__, handle, state?"TRUE":"FALSE", broadcast?"TRUE":"FALSE"); #endif if (state == TRUE) { /* Tell everyone blocking on a single handle */ /* The condition the global signal cond is waiting on is the signalling of * _any_ handle. So lock it before setting the signalled state. */ mono_os_mutex_lock (&global_signal_mutex); /* This function _must_ be called with * handle->signal_mutex locked */ handle_data->signalled=state; if (broadcast == TRUE) { mono_os_cond_broadcast (&handle_data->signal_cond); } else { mono_os_cond_signal (&handle_data->signal_cond); } /* Tell everyone blocking on multiple handles that something * was signalled */ mono_os_cond_broadcast (&global_signal_cond); mono_os_mutex_unlock (&global_signal_mutex); } else { handle_data->signalled=state; } }