void xntimer_tick_periodic_inner(xntslave_t *slave) { xnsched_t *sched = xnpod_current_sched(); xntbase_t *base = &slave->base; xntlholder_t *holder; xnqueue_t *timerq; xntimer_t *timer; /* * Update the periodic clocks keeping the things strictly * monotonous (this routine is run on every cpu, but only CPU * XNTIMER_KEEPER_ID should do this). */ if (sched == xnpod_sched_slot(XNTIMER_KEEPER_ID)) ++base->jiffies; timerq = &slave->cascade[xnsched_cpu(sched)].wheel[base->jiffies & XNTIMER_WHEELMASK]; while ((holder = xntlist_head(timerq)) != NULL) { timer = plink2timer(holder); if ((xnsticks_t) (xntlholder_date(&timer->plink) - base->jiffies) > 0) break; trace_mark(xn_nucleus, timer_expire, "timer %p", timer); xntimer_dequeue_periodic(timer); xnstat_counter_inc(&timer->fired); timer->handler(timer); if (!xntimer_reload_p(timer)) continue; __setbits(timer->status, XNTIMER_FIRED); xntlholder_date(&timer->plink) = base->jiffies + timer->interval; xntimer_enqueue_periodic(timer); } xnsched_tick(sched->curr, base); /* Do time-slicing if required. */ }
static void roundrobin_handler(struct xntimer *timer) { struct xnsched *sched = container_of(timer, struct xnsched, rrbtimer); xnsched_tick(sched); }