/** * mono_mlist_prepend: * @list: the managed list * @data: the object to add to the list * * Allocate a new list node with @data as content and prepend it * to the list @list. @list can be NULL. */ MonoMList* mono_mlist_prepend (MonoMList* list, MonoObject *data) { MonoMList* res = mono_mlist_alloc (data); if (list) MONO_OBJECT_SETREF (res, next, list); return res; }
/** * mono_mlist_append: * @list: the managed list * @data: the object to add to the list * * Allocate a new list node with @data as content and append it * to the list @list. @list can be NULL. * Since managed lists are singly-linked, this operation takes O(n) time. */ MonoMList* mono_mlist_append (MonoMList* list, MonoObject *data) { MonoMList* res = mono_mlist_alloc (data); if (list) { MonoMList* last = mono_mlist_last (list); MONO_OBJECT_SETREF (last, next, res); return list; } else { return res; } }
static void socket_io_add (MonoAsyncResult *ares, MonoSocketAsyncResult *state) { MonoMList *list; SocketIOData *data = &socket_io_data; int fd; gboolean is_new; int ievt; socket_io_init (&socket_io_data); if (mono_runtime_is_shutting_down () || data->inited == 3 || data->sock_to_state == NULL) return; if (async_tp.pool_status == 2) return; MONO_OBJECT_SETREF (state, ares, ares); fd = GPOINTER_TO_INT (state->handle); EnterCriticalSection (&data->io_lock); if (data->sock_to_state == NULL) { LeaveCriticalSection (&data->io_lock); return; } list = mono_g_hash_table_lookup (data->sock_to_state, GINT_TO_POINTER (fd)); if (list == NULL) { list = mono_mlist_alloc ((MonoObject*)state); is_new = TRUE; } else { list = mono_mlist_append (list, (MonoObject*)state); is_new = FALSE; } mono_g_hash_table_replace (data->sock_to_state, state->handle, list); ievt = get_events_from_list (list); data->modify (data->event_data, fd, state->operation, ievt, is_new); LeaveCriticalSection (&data->io_lock); }