#ifndef UCS_TIMERQ_H
#define UCS_TIMERQ_H
#include <ucs/datastruct/queue.h>
#include <ucs/time/time.h>
#include <ucs/type/status.h>
#include <ucs/sys/preprocessor.h>
#include <ucs/type/spinlock.h>
typedef struct ucs_timer {
ucs_time_t expiration;
ucs_time_t interval;
int id;
} ucs_timer_t;
typedef struct ucs_timer_queue {
ucs_recursive_spinlock_t lock;
ucs_time_t min_interval;
ucs_timer_t *timers;
unsigned num_timers;
} ucs_timer_queue_t;
ucs_status_t ucs_timerq_init(ucs_timer_queue_t *timerq);
void ucs_timerq_cleanup(ucs_timer_queue_t *timerq);
ucs_status_t ucs_timerq_add(ucs_timer_queue_t *timerq, int timer_id,
ucs_time_t interval);
ucs_status_t ucs_timerq_remove(ucs_timer_queue_t *timerq, int timer_id);
static inline ucs_time_t ucs_timerq_min_interval(ucs_timer_queue_t *timerq) {
return timerq->min_interval;
}
static inline int ucs_timerq_size(ucs_timer_queue_t *timerq) {
return timerq->num_timers;
}
static inline int ucs_timerq_is_empty(ucs_timer_queue_t *timerq) {
return ucs_timerq_size(timerq) == 0;
}
#define ucs_timerq_for_each_expired(_timer, _timerq, _current_time, _code) \
{ \
ucs_time_t __current_time = _current_time; \
ucs_recursive_spin_lock(&(_timerq)->lock); \
for (_timer = (_timerq)->timers; \
_timer != (_timerq)->timers + (_timerq)->num_timers; \
++_timer) \
{ \
if (__current_time >= (_timer)->expiration) { \
\
(_timer)->expiration = __current_time + (_timer)->interval; \
_code; \
} \
} \
ucs_recursive_spin_unlock(&(_timerq)->lock); \
}
#endif