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 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 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; }