MT#62181 wheeltimer: use std::list

... instead of manually maintaining a linked list.

Store an iterator in the timer object so that it can be directly removed
if needed.

Change-Id: I38f1fbcdc6fe1b36a8adef6a95f36f8902a4f729
mr13.3.1
Richard Fuchs 2 years ago
parent f91b497681
commit fff6cb3103

@ -123,15 +123,12 @@ void _wheeltimer::update_wheel(int wheel)
int pos = (wall_clock >> (wheel*BITS_PER_WHEEL))
& ((1<<BITS_PER_WHEEL)-1);
timer *t = (timer*)wheels[wheel][pos].next;
while( t ) {
timer* t1 = (timer*)t->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;
}

@ -36,6 +36,7 @@
#include <inttypes.h>
#include <time.h>
#include <deque>
#include <list>
#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*> 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

Loading…
Cancel
Save