- _time_get(&val);
- timer->running = 0;
- _time_add(&timer->elapsed, &timer->elapsed, _time_sub(&tgt, &val, &timer->start));
- _time_reset(&timer->start);
+ ir_timer_val_t val;
+ ir_timer_val_t tgt;
+
+ _time_get(&val);
+ timer->running = 0;
+ _time_add(&timer->elapsed, &timer->elapsed, _time_sub(&tgt, &val, &timer->start));
+}
+
+void ir_timer_init_parent(ir_timer_t *timer)
+{
+ if (timer == NULL)
+ return;
+ if (timer->parent != NULL && timer->parent != timer_stack)
+ panic("timer parent mismatch");
+ timer->parent = timer_stack;
+}
+
+void ir_timer_push(ir_timer_t *timer)
+{
+ if (timer->running)
+ panic("timer started twice");
+
+ ir_timer_t *parent = timer->parent;
+ if (timer->parent == NULL)
+ panic("pushing timer with unknown parent");
+
+ timer->displaced = timer_stack;
+ for (ir_timer_t *t = timer_stack; t != parent; t = t->parent) {
+ if (t == NULL)
+ panic("parent timer not on stack");
+ ir_timer_stop(t);