void add_by_address_list(t_chunk *chunk, t_chunk **list, t_chunk **tail) { t_chunk *tmp; int flag; tmp = ((chunk - (*list)) > ((*tail) - chunk)) ? (*tail) : (*list); flag = ((chunk - (*list)) > ((*tail) - chunk)) ? 1 : 0; if (!tmp || (*tail) < chunk) return (add_tail_list(chunk, list, tail)); while (tmp) { if (chunk < tmp && (!tmp->prev || (tmp->prev) < chunk)) { chunk->next = tmp; chunk->prev = tmp->prev; if (tmp->prev) (tmp->prev)->next = chunk; tmp->prev = chunk; if (!chunk->prev) (*list) = chunk; return; } tmp = (!flag) ? tmp->next : tmp->prev; } return (add_tail_list(chunk, list, tail)); }
static void olock_free(resource *r) { struct object_lock *q, *l = (struct object_lock *) r; node *n; DBG("olock: Freeing %p\n", l); switch (l->state) { case OLOCK_STATE_FREE: break; case OLOCK_STATE_LOCKED: case OLOCK_STATE_EVENT: rem_node(&l->n); n = HEAD(l->waiters); if (n->next) { DBG("olock: -> %p becomes locked\n", n); q = SKIP_BACK(struct object_lock, n, n); rem_node(n); add_tail_list(&q->waiters, &l->waiters); q->state = OLOCK_STATE_EVENT; add_head(&olock_list, n); ev_schedule(olock_event); } break; case OLOCK_STATE_WAITING: rem_node(&l->n); break; default: ASSERT(0); }
/** * ev_run_list - run an event list * @l: an event list * * This function calls ev_run() for all events enqueued in the list @l. */ int ev_run_list(event_list *l) { node *n; list tmp_list; init_list(&tmp_list); add_tail_list(&tmp_list, l); init_list(l); WALK_LIST_FIRST(n, tmp_list) { event *e = SKIP_BACK(event, n, n); ev_run(e); }