static void cleanup (void) { /* we make the assumption along the code that we are * cleaning up only if the runtime is shutting down */ g_assert (mono_runtime_is_shutting_down ()); selector_thread_wakeup (); while (io_selector_running) g_usleep (1000); mono_mutex_destroy (&threadpool_io->updates_lock); mono_cond_destroy (&threadpool_io->updates_cond); threadpool_io->backend.cleanup (); #if !defined(HOST_WIN32) close (threadpool_io->wakeup_pipes [0]); close (threadpool_io->wakeup_pipes [1]); #else closesocket (threadpool_io->wakeup_pipes [0]); closesocket (threadpool_io->wakeup_pipes [1]); #endif g_assert (threadpool_io); g_free (threadpool_io); threadpool_io = NULL; g_assert (!threadpool_io); }
void ves_icall_System_IOSelector_Add (gpointer handle, MonoIOSelectorJob *job) { ThreadPoolIOUpdate *update; g_assert (handle >= 0); g_assert (job->operation == EVENT_IN ^ job->operation == EVENT_OUT); g_assert (job->callback); if (mono_runtime_is_shutting_down ()) return; if (mono_domain_is_unloading (mono_object_domain (job))) return; mono_lazy_initialize (&io_status, initialize); mono_mutex_lock (&threadpool_io->updates_lock); update = update_get_new (); update->type = UPDATE_ADD; update->data.add.fd = GPOINTER_TO_INT (handle); update->data.add.job = job; mono_memory_barrier (); /* Ensure this is safely published before we wake up the selector */ selector_thread_wakeup (); mono_mutex_unlock (&threadpool_io->updates_lock); }
static void cleanup (void) { /* we make the assumption along the code that we are * cleaning up only if the runtime is shutting down */ g_assert (mono_runtime_is_shutting_down ()); selector_thread_wakeup (); while (io_selector_running) mono_thread_info_usleep (1000); }
void mono_threadpool_ms_io_remove_domain_jobs (MonoDomain *domain) { ThreadPoolIOUpdate *update; if (!mono_lazy_is_initialized (&io_status)) return; mono_mutex_lock (&threadpool_io->updates_lock); update = update_get_new (); update->type = UPDATE_REMOVE_DOMAIN; update->data.remove_domain.domain = domain; mono_memory_barrier (); /* Ensure this is safely published before we wake up the selector */ selector_thread_wakeup (); mono_cond_wait (&threadpool_io->updates_cond, &threadpool_io->updates_lock); mono_mutex_unlock (&threadpool_io->updates_lock); }
void mono_threadpool_ms_io_remove_socket (int fd) { ThreadPoolIOUpdate *update; if (!mono_lazy_is_initialized (&io_status)) return; mono_mutex_lock (&threadpool_io->updates_lock); update = update_get_new (); update->type = UPDATE_REMOVE_SOCKET; update->data.add.fd = fd; mono_memory_barrier (); /* Ensure this is safely published before we wake up the selector */ selector_thread_wakeup (); mono_cond_wait (&threadpool_io->updates_cond, &threadpool_io->updates_lock); mono_mutex_unlock (&threadpool_io->updates_lock); }