static MonoObject * get_io_event (MonoMList **list, gint event) { MonoObject *state; MonoMList *current; MonoMList *prev; current = *list; prev = NULL; state = NULL; while (current) { state = mono_mlist_get_data (current); if (get_event_from_state ((MonoSocketAsyncResult *) state) == event) break; state = NULL; prev = current; current = mono_mlist_next (current); } if (current) { if (prev) { mono_mlist_set_next (prev, mono_mlist_next (current)); } else { *list = mono_mlist_next (*list); } } return state; }
static void filter_jobs_for_domain (gpointer key, gpointer value, gpointer user_data) { FilterSockaresForDomainData *data; MonoMList *list = value, *element; MonoDomain *domain; MonoGHashTable *states; g_assert (user_data); data = user_data; domain = data->domain; states = data->states; for (element = list; element; element = mono_mlist_next (element)) { MonoIOSelectorJob *job = (MonoIOSelectorJob*) mono_mlist_get_data (element); if (mono_object_domain (job) == domain) mono_mlist_set_data (element, NULL); } /* we skip all the first elements which are NULL */ for (; list; list = mono_mlist_next (list)) { if (mono_mlist_get_data (list)) break; } if (list) { g_assert (mono_mlist_get_data (list)); /* we delete all the NULL elements after the first one */ for (element = list; element;) { MonoMList *next; if (!(next = mono_mlist_next (element))) break; if (mono_mlist_get_data (next)) element = next; else mono_mlist_set_next (element, mono_mlist_next (next)); } } mono_g_hash_table_replace (states, key, list); }