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); }
thread_t* context_select (void) { thread_t *t, *x; #ifdef CLASS_HACKERY_NONDET if (!readyQh) { ch_update_readyQ (); } #endif q_del (readyQh, readyQt, t); if (!t) { context_cleanup (); if (thread_cleanup) (*thread_cleanup)(); #ifdef DEBUG_MODE2 printf("\nNo more processes.\n"); #endif /* DEBUG_MODE2 */ exit (0); } t->in_readyq = 0; inconsistent_timer = time_max (inconsistent_timer, t->time); while (timerQh && inconsistent_timer >= timerQh->time) { q_del (timerQh, timerQl, x); x->in_readyq = 1; q_ins (readyQh, readyQt, x); } return t; }
/* * Pops an entry from a level that is not past a sentinel. */ static struct entry *q_pop_old(struct queue *q, unsigned max_level) { struct entry *e = q_peek(q, max_level, false); if (e) q_del(q, e); return e; }
static struct entry *q_pop(struct queue *q) { struct entry *e = q_peek(q, q->nr_levels, true); if (e) q_del(q, e); return e; }
static void __update_demote_sentinels(struct smq_policy *mq) { unsigned level; struct queue *q = &mq->clean; struct entry *sentinel; for (level = 0; level < q->nr_levels; level++) { sentinel = demote_sentinel(mq, level); q_del(q, sentinel); q_push(q, sentinel); } }
static void __update_writeback_sentinels(struct smq_policy *mq) { unsigned level; struct queue *q = &mq->dirty; struct entry *sentinel; for (level = 0; level < q->nr_levels; level++) { sentinel = writeback_sentinel(mq, level); q_del(q, sentinel); q_push(q, sentinel); } }
/* * Removes an entry from cache. Removes from the hash table. */ static void __del(struct smq_policy *mq, struct queue *q, struct entry *e) { q_del(q, e); h_remove(&mq->table, e); }