static void q_requeue_before(struct queue *q, struct entry *dest, struct entry *e, unsigned extra_levels) { struct entry *de; unsigned new_level; q_del(q, e); if (extra_levels && (e->level < q->nr_levels - 1u)) { new_level = min(q->nr_levels - 1u, e->level + extra_levels); for (de = l_head(q->es, q->qs + new_level); de; de = l_next(q->es, de)) { if (de->sentinel) continue; q_del(q, de); de->level = e->level; if (dest) q_push_before(q, dest, de); else q_push(q, de); break; } e->level = new_level; } q_push(q, e); }
/* * This function assumes there is a non-sentinel entry to pop. It's only * used by redistribute, so we know this is true. It also doesn't adjust * the q->nr_elts count. */ static struct entry *__redist_pop_from(struct queue *q, unsigned level) { struct entry *e; for (; level < q->nr_levels; level++) for (e = l_head(q->es, q->qs + level); e; e = l_next(q->es, e)) if (!e->sentinel) { l_del(q->es, q->qs + e->level, e); return e; } return NULL; }
List l_cloneList(List l){ List newList = malloc(sizeof(struct list)); assert(newList); newList->size = 0; newList->first = NULL; newList->current = NULL; newList->last = NULL; l_head(l); while(!l_isOutOfList(l)){ l_addInFront(newList, l_getVal(l)); l_next(l); } return newList; }
static void l_add_head(struct entry_space *es, struct ilist *l, struct entry *e) { struct entry *head = l_head(es, l); e->next = l->head; e->prev = INDEXER_NULL; if (head) head->prev = l->head = to_index(es, e); else l->head = l->tail = to_index(es, e); if (!e->sentinel) l->nr_elts++; }
int cb_run(struct list *l, void *arg) { struct list *node; struct callback *cb; int r; abort_unless(l); node = l_head(l); while ( node != l_end(l) ) { cb = container(node, struct callback, entry); node = node->next; if ( (r = (*cb->func)(arg, cb)) ) return r; } return 0; }
static int smq_save_hints(struct smq_policy *mq, struct queue *q, policy_walk_fn fn, void *context) { int r; unsigned level; struct entry *e; for (level = 0; level < q->nr_levels; level++) for (e = l_head(q->es, q->qs + level); e; e = l_next(q->es, e)) { if (!e->sentinel) { r = fn(context, infer_cblock(mq, e), e->oblock, e->level); if (r) return r; } } return 0; }
/* * Return the oldest entry of the lowest populated level. */ static struct entry *q_peek(struct queue *q, unsigned max_level, bool can_cross_sentinel) { unsigned level; struct entry *e; max_level = min(max_level, q->nr_levels); for (level = 0; level < max_level; level++) for (e = l_head(q->es, q->qs + level); e; e = l_next(q->es, e)) { if (e->sentinel) { if (can_cross_sentinel) continue; else break; } return e; } return NULL; }
// Supprime le premier élément void l_deleteHead(List l){ Elem first = l->first; if (first != NULL) l_freeElem(l, first); l_head(l); }