blob: 8357a1989568279013a61731980b7ae18d2ee377 [file] [log] [blame]
/* $Id$
*
*/
#ifndef __PJPP_TIMER_H__
#define __PJPP_TIMER_H__
#include <pj/timer.h>
#include <pj++/types.hpp>
class PJ_Timer_Heap;
class PJ_Timer_Entry : private pj_timer_entry
{
friend class PJ_Timer_Heap;
public:
static void timer_heap_callback(pj_timer_heap_t *, pj_timer_entry *);
PJ_Timer_Entry() { cb = &timer_heap_callback; }
PJ_Timer_Entry(int arg_id, void *arg_user_data)
{
cb = &timer_heap_callback;
init(arg_id, arg_user_data);
}
virtual void on_timeout() = 0;
void init(int arg_id, void *arg_user_data)
{
id = arg_id;
user_data = arg_user_data;
}
int get_id() const
{
return id;
}
void set_id(int arg_id)
{
id = arg_id;
}
void set_user_data(void *arg_user_data)
{
user_data = arg_user_data;
}
void *get_user_data() const
{
return user_data;
}
const PJ_Time_Val &get_timeout() const
{
pj_assert(sizeof(PJ_Time_Val) == sizeof(pj_time_val));
return (PJ_Time_Val&)_timer_value;
}
};
class PJ_Timer_Heap
{
public:
PJ_Timer_Heap() {}
bool create(PJ_Pool *pool, pj_size_t initial_count,
unsigned flag = PJ_TIMER_HEAP_SYNCHRONIZE)
{
ht_ = pj_timer_heap_create(pool->pool_(), initial_count, flag);
return ht_ != NULL;
}
pj_timer_heap_t *get_timer_heap()
{
return ht_;
}
bool schedule( PJ_Timer_Entry *ent, const PJ_Time_Val &delay)
{
return pj_timer_heap_schedule(ht_, ent, &delay) == 0;
}
bool cancel(PJ_Timer_Entry *ent)
{
return pj_timer_heap_cancel(ht_, ent) == 1;
}
pj_size_t count()
{
return pj_timer_heap_count(ht_);
}
void earliest_time(PJ_Time_Val *t)
{
pj_timer_heap_earliest_time(ht_, t);
}
int poll(PJ_Time_Val *next_delay = NULL)
{
return pj_timer_heap_poll(ht_, next_delay);
}
private:
pj_timer_heap_t *ht_;
};
#endif /* __PJPP_TIMER_H__ */