runq
int runq;
runq = 0;
runq = 1;
if (runq)
mta_on_timeout(struct runq *runq, void *arg)
if (runq == runq_relay) {
else if (runq == runq_connector) {
else if (runq == runq_route) {
else if (runq == runq_hoststat) {
static struct runq *runq_relay;
static struct runq *runq_connector;
static struct runq *runq_route;
static struct runq *runq_hoststat;
static void mta_on_timeout(struct runq *, void *);
static void mta_on_timeout(struct runq *, void *);
static struct runq *hangon;
mta_on_timeout(struct runq *runq, void *arg)
runq_schedule(struct runq *runq, time_t delay, void *arg)
return runq_schedule_at(runq, t + delay, arg);
runq_schedule_at(struct runq *runq, time_t when, void *arg)
TAILQ_FOREACH(tmpjob, &runq->jobs, entry) {
TAILQ_INSERT_TAIL(&runq->jobs, job, entry);
if (runq != active && job == TAILQ_FIRST(&runq->jobs)) {
evtimer_del(&runq->ev);
runq_reset(runq);
runq_cancel(struct runq *runq, void *arg)
first = TAILQ_FIRST(&runq->jobs);
TAILQ_FOREACH(job, &runq->jobs, entry) {
TAILQ_REMOVE(&runq->jobs, job, entry);
if (runq != active && job == first) {
evtimer_del(&runq->ev);
runq_reset(runq);
runq_pending(struct runq *runq, void *arg, time_t *when)
TAILQ_FOREACH(job, &runq->jobs, entry) {
void (*cb)(struct runq *, void *);
static struct runq *active;
runq_reset(struct runq *runq)
job = TAILQ_FIRST(&runq->jobs);
evtimer_add(&runq->ev, &tv);
struct runq *runq = arg;
active = runq;
while((job = TAILQ_FIRST(&runq->jobs))) {
TAILQ_REMOVE(&runq->jobs, job, entry);
runq->cb(runq, job->arg);
runq_reset(runq);
runq_init(struct runq **runqp, void (*cb)(struct runq *, void *))
struct runq *runq;
runq = malloc(sizeof(*runq));
if (runq == NULL)
runq->cb = cb;
TAILQ_INIT(&runq->jobs);
evtimer_set(&runq->ev, runq_timeout, runq);
*runqp = runq;
struct runq;
int runq_init(struct runq **, void (*)(struct runq *, void *));
int runq_schedule(struct runq *, time_t, void *);
int runq_schedule_at(struct runq *, time_t, void *);
int runq_cancel(struct runq *, void *);
int runq_pending(struct runq *, void *, time_t *);