diff --git a/os/include/dde_kit/timer.h b/os/include/dde_kit/timer.h index 23bc38e46a..fff47dda29 100644 --- a/os/include/dde_kit/timer.h +++ b/os/include/dde_kit/timer.h @@ -62,6 +62,16 @@ struct dde_kit_timer *dde_kit_timer_add(void (*fn)(void *), void *priv, */ void dde_kit_timer_del(struct dde_kit_timer *timer); + +/** + * Schedule absolute timeout + * + * \param timer timer reference + * \param timeout absolute timeout (in DDE kit ticks) + */ +void dde_kit_timer_schedule_absolute(struct dde_kit_timer *timer, unsigned long timeout); + + /** * Check whether a timer is pending * diff --git a/os/src/lib/dde_kit/timer.cc b/os/src/lib/dde_kit/timer.cc index 0bc23654f6..2406cb53fc 100644 --- a/os/src/lib/dde_kit/timer.cc +++ b/os/src/lib/dde_kit/timer.cc @@ -149,8 +149,12 @@ class dde_kit_timer : public Alarm, public List::Element public: dde_kit_timer(void (*handler)(void *), void *priv, unsigned long absolute_timeout) - : _handler(handler), _priv(priv), _pending(true) + : _handler(handler), _priv(priv), _pending(true) { + schedule(absolute_timeout); } + + void schedule(unsigned long absolute_timeout) { + _pending = true; _timer_thread->schedule_absolute(this, absolute_timeout); } @@ -183,6 +187,10 @@ extern "C" struct dde_kit_timer *dde_kit_timer_add(void (*fn)(void *), void *pri } +extern "C" void dde_kit_timer_schedule_absolute(struct dde_kit_timer *timer, unsigned long timeout) { + timer->schedule(timeout); } + + extern "C" void dde_kit_timer_del(struct dde_kit_timer *timer) { try {