diff --git a/core/sip/wheeltimer.cpp b/core/sip/wheeltimer.cpp index 8cf3df81..388310ae 100644 --- a/core/sip/wheeltimer.cpp +++ b/core/sip/wheeltimer.cpp @@ -123,15 +123,12 @@ void _wheeltimer::update_wheel(int wheel) int pos = (wall_clock >> (wheel*BITS_PER_WHEEL)) & ((1<next; - place_timer(t,wheel-1); - t = t1; + auto& w = wheels[wheel][pos]; + while (!w.empty()) { + auto* t = w.front(); + w.pop_front(); + place_timer(t, wheel-1); } - - wheels[wheel][pos].next = NULL; } } @@ -183,23 +180,18 @@ void _wheeltimer::process_events() void _wheeltimer::process_current_timers() { - timer *t = (timer *)wheels[0][wall_clock & 0xFF].next; - - while(t){ + auto& w = wheels[0][wall_clock & 0xFF]; - timer* t1 = (timer*)t->next; + while (!w.empty()) { + auto* t = w.front(); + w.pop_front(); - t->next = NULL; - t->prev = NULL; + t->list = NULL; t->disarm(); num_timers--; t->fire(); - - t = t1; } - - wheels[0][wall_clock & 0xFF].next = NULL; } void _wheeltimer::place_timer(timer* t) @@ -240,26 +232,18 @@ void _wheeltimer::place_timer(timer* t, int wheel) void _wheeltimer::add_timer_to_wheel(timer* t, int wheel, unsigned int pos) { - t->next = wheels[wheel][pos].next; - wheels[wheel][pos].next = t; - - if(t->next){ - ((timer*)t->next)->prev = t; - } - - t->prev = &(wheels[wheel][pos]); + t->list = &wheels[wheel][pos]; + t->list->push_front(t); + t->pos = wheels[wheel][pos].begin(); } void _wheeltimer::delete_timer(timer* t) { - if(t->prev) { - t->prev->next = t->next; - num_timers--; + if (t->list) { + t->list->erase(t->pos); + t->list = NULL; } - if(t->next) - ((timer*)t->next)->prev = t->prev; - delete t; } diff --git a/core/sip/wheeltimer.h b/core/sip/wheeltimer.h index 083c9175..e33f35dc 100644 --- a/core/sip/wheeltimer.h +++ b/core/sip/wheeltimer.h @@ -36,6 +36,7 @@ #include #include #include +#include #include "atomic_types.h" @@ -45,33 +46,27 @@ // do not change #define WHEELS 4 -class base_timer -{ -public: - base_timer* next; +class timer; - base_timer():next(0) {} - virtual ~base_timer() {} -}; +typedef std::list timer_list; -class timer: public base_timer +class timer { public: - base_timer* prev; + // for fast removal: + timer_list::iterator pos; + timer_list* list; timer() - : base_timer(), - prev(0), expires(0), expires_rel(0) + : list(NULL), expires(0), expires_rel(0) {} timer(uint64_t expires) - : base_timer(), - prev(0), expires(0), expires_rel(expires) + : list(NULL), expires(0), expires_rel(expires) {} timer(const timer &t) - : base_timer(), - prev(0), expires(t.expires), expires_rel(t.expires_rel) + : list(NULL), expires(t.expires), expires_rel(t.expires_rel) {} virtual ~timer(); @@ -122,7 +117,7 @@ class _wheeltimer: }; //the timer wheel - base_timer wheels[WHEELS][ELMTS_PER_WHEEL]; + timer_list wheels[WHEELS][ELMTS_PER_WHEEL]; unsigned int num_timers; uint64_t resolution; // microseconds