summaryrefslogtreecommitdiff
path: root/ptimer.c
diff options
context:
space:
mode:
Diffstat (limited to 'ptimer.c')
-rw-r--r--ptimer.c37
1 files changed, 26 insertions, 11 deletions
diff --git a/ptimer.c b/ptimer.c
index 7d8662d..5f9cf5d 100644
--- a/ptimer.c
+++ b/ptimer.c
@@ -62,19 +62,26 @@ ptimer_tick(struct ptimer *ptimer)
unsigned diff = (unsigned)(now - ptimer->previous_time);
struct ptimer_task *ptask, *ptmp;
- fprintf(stderr, "Got a tick of %u secs\n", diff);
+ debug(DBG_TIMER, "got a tick of %u secs", diff);
list_for_each_entry_safe(ptask, ptmp, &ptimer->ptasks, list) {
if (ptask->remain > diff) {
ptask->remain -= diff;
continue;
}
+ debug(DBG_TIMER, "triggering ptask %p (times %u)",
+ ptask, ptask->times);
+
ptask->cb(ptask);
ptask->remain = ptask->interval;
- if (ptask->times > 0) {
- ptask->times--;
- if (ptask->times == 0)
- list_del(&ptask->list);
+
+ if (ptask->times == 0)
+ continue;
+
+ ptask->times--;
+ if (ptask->times == 0) {
+ ptask->active = false;
+ list_del(&ptask->list);
}
}
@@ -87,8 +94,10 @@ ptimer_reconfig(struct ptimer *ptimer)
struct ptimer_task *ptask;
unsigned i = 0;
unsigned lowest = ~0;
+ unsigned interval;
if (list_empty(&ptimer->ptasks)) {
+ debug(DBG_TIMER, "no tasks");
ptimer_set(0, 0);
return;
}
@@ -101,8 +110,10 @@ ptimer_reconfig(struct ptimer *ptimer)
intervals[i++] = ptask->interval;
}
- fprintf(stderr, "Lowest %u GCD is %u\n", lowest, array_gcd(intervals, i));
- ptimer_set(lowest, array_gcd(intervals, i));
+ interval = array_gcd(intervals, i);
+
+ debug(DBG_TIMER, "lowest: %u, gcd: %u\n", lowest, interval);
+ ptimer_set(lowest, interval);
}
void
@@ -110,9 +121,12 @@ ptimer_del_task(struct ptimer_task *ptask)
{
struct ptimer *ptimer = cfg->ptimer;
- assert_return(ptask && ptimer && ptimer->task_count > 0);
+ assert_return(ptask && ptimer);
+ assert_return_silent(ptask->active);
+ assert_return(ptimer->task_count > 0);
list_del(&ptask->list);
+ ptask->active = false;
ptimer->task_count--;
ptimer_tick(ptimer);
ptimer_reconfig(ptimer);
@@ -125,8 +139,10 @@ ptimer_add_task(struct ptimer_task *ptask)
struct ptimer *ptimer = cfg->ptimer;
assert_return(ptask && ptask->interval > 0 && ptask->cb && ptimer);
+ assert_return_silent(!ptask->active);
uring_task_get(&ptimer->task);
+ ptask->active = true;
ptask->remain = ptask->interval;
ptimer_tick(ptimer);
list_add(&ptask->list, &ptimer->ptasks);
@@ -149,7 +165,7 @@ ptimer_free(struct uring_task *task)
assert_return(task);
- debug(DBG_ANN, "task %p, ptimer %p", task, ptimer);
+ debug(DBG_TIMER, "task %p, ptimer %p", task, ptimer);
xfree(ptimer);
cfg->ptimer = NULL;
}
@@ -159,7 +175,7 @@ ptimer_delete()
{
assert_return(cfg->ptimer);
- debug(DBG_ANN, "closing fd %i", cfg->ptimer->task.fd);
+ debug(DBG_TIMER, "closing fd %i", cfg->ptimer->task.fd);
uring_task_destroy(&cfg->ptimer->task);
}
@@ -176,7 +192,6 @@ ptimer_cb(struct uring_task *task, int res)
return;
}
- debug(DBG_IGMP, "Called");
ptimer_tick(ptimer);
uring_read(&ptimer->task, &ptimer->value, sizeof(ptimer->value), ptimer_cb);
}