static int get_events_from_list (MonoMList *list) { MonoSocketAsyncResult *state; int events = 0; while (list && (state = (MonoSocketAsyncResult *)mono_mlist_get_data (list))) { events |= get_event_from_state (state); list = mono_mlist_next (list); } return events; }
static gboolean remove_sockstate_for_domain (gpointer key, gpointer value, gpointer user_data) { MonoMList *list = value; gboolean remove = FALSE; while (list) { MonoObject *data = mono_mlist_get_data (list); if (mono_object_domain (data) == user_data) { MonoClass *class = mono_object_get_class (data); remove = TRUE; mono_mlist_set_data (list, NULL); } list = mono_mlist_next (list); }
void mono_gc_finalize_threadpool_threads (void) { while (threads_to_finalize) { MonoInternalThread *thread = (MonoInternalThread*) mono_mlist_get_data (threads_to_finalize); /* Force finalization of the thread. */ thread->threadpool_thread = FALSE; mono_object_register_finalizer ((MonoObject*)thread); mono_gc_run_finalize (thread, NULL); threads_to_finalize = mono_mlist_next (threads_to_finalize); } }
static gboolean remove_sockstate_for_domain (gpointer key, gpointer value, gpointer user_data) { MonoMList *list = value; gboolean remove = FALSE; while (list) { MonoObject *data = mono_mlist_get_data (list); if (mono_object_domain (data) == user_data) { remove = TRUE; mono_mlist_set_data (list, NULL); } list = mono_mlist_next (list); } //FIXME is there some sort of additional unregistration we need to perform here? return remove; }
static MonoIOSelectorJob* get_job_for_event (MonoMList **list, gint32 event) { MonoMList *current; g_assert (list); for (current = *list; current; current = mono_mlist_next (current)) { MonoIOSelectorJob *job = (MonoIOSelectorJob*) mono_mlist_get_data (current); if (job->operation == event) { *list = mono_mlist_remove_item (*list, current); return job; } } return NULL; }
static void threadpool_clear_queue (ThreadPool *tp, MonoDomain *domain) { MonoObject *obj; MonoMList *other; other = NULL; while (mono_cq_dequeue (tp->queue, &obj)) { if (obj == NULL) continue; if (obj->vtable->domain != domain) other = mono_mlist_prepend (other, obj); threadpool_jobs_dec (obj); } while (other) { threadpool_append_job (tp, (MonoObject *) mono_mlist_get_data (other)); other = mono_mlist_next (other); } }
static void threadpool_clear_queue (ThreadPool *tp, MonoDomain *domain) { MonoObject *obj; MonoMList *other; int domain_count; other = NULL; domain_count = 0; while (mono_cq_dequeue (tp->queue, &obj)) { if (obj != NULL && obj->vtable->domain == domain) { domain_count++; threadpool_jobs_dec (obj); } else if (obj != NULL) { other = mono_mlist_prepend (other, obj); } } while (other) { threadpool_append_job (tp, (MonoObject *) mono_mlist_get_data (other)); other = mono_mlist_next (other); } }
static MonoMList * process_io_event (MonoMList *list, int event) { MonoSocketAsyncResult *state; MonoMList *oldlist; oldlist = list; state = NULL; while (list) { state = (MonoSocketAsyncResult *) mono_mlist_get_data (list); if (get_event_from_state (state) == event) break; list = mono_mlist_next (list); } if (list != NULL) { oldlist = mono_mlist_remove_item (oldlist, list); EPOLL_DEBUG ("Dispatching event %d on socket %p", event, state->handle); threadpool_append_job (&async_io_tp, (MonoObject *) state); } return oldlist; }