diff --git a/core/sip/wheeltimer.cpp b/core/sip/wheeltimer.cpp index a3649f28..1d289f4b 100644 --- a/core/sip/wheeltimer.cpp +++ b/core/sip/wheeltimer.cpp @@ -64,17 +64,17 @@ wheeltimer::~wheeltimer() void wheeltimer::insert_timer(timer* t) { //add new timer to user request list - utimer_m.lock(); - utimer_add.push(t); - utimer_m.unlock(); + utimer_add_m.lock(); + utimer_add.push_back(t); + utimer_add_m.unlock(); } void wheeltimer::remove_timer(timer* t) { //add new timer to user request list - utimer_m.lock(); - utimer_rem.push(t); - utimer_m.unlock(); + utimer_rem_m.lock(); + utimer_rem.push_back(t); + utimer_rem_m.unlock(); } void wheeltimer::run() @@ -155,18 +155,28 @@ void wheeltimer::turn_wheel() update_wheel(i); // Check for timer insertion requests - utimer_m.lock(); - while(!utimer_add.empty()) { - place_timer(utimer_add.front()); - utimer_add.pop(); + utimer_add_m.lock(); + std::vector utimer_add_cp = utimer_add; + utimer_add.clear(); + utimer_add_m.unlock(); + + for (std::vector::iterator it= + utimer_add_cp.begin(); it != + utimer_add_cp.end(); it++) { + place_timer(*it); } // Check for timer deletion requests - while(!utimer_rem.empty()) { - delete_timer(utimer_rem.front()); - utimer_rem.pop(); + utimer_rem_m.lock(); + std::vector utimer_rem_cp = utimer_rem; + utimer_rem.clear(); + utimer_rem_m.unlock(); + + for (std::vector::iterator it= + utimer_rem_cp.begin(); it != + utimer_rem_cp.end(); it++) { + delete_timer(*it); } - utimer_m.unlock(); //check for expired timer to process process_current_timers(); diff --git a/core/sip/wheeltimer.h b/core/sip/wheeltimer.h index 2dc53685..99eb44a1 100644 --- a/core/sip/wheeltimer.h +++ b/core/sip/wheeltimer.h @@ -89,14 +89,17 @@ class wheeltimer: public AmThread //the timer wheel base_timer wheels[WHEELS][ELMTS_PER_WHEEL]; - // utimer add/remove lock - AmMutex utimer_m; + // utimer remove lock + AmMutex utimer_add_m; //list with timer insertions requests - std::queue utimer_add; + std::vector utimer_add; + + // utimer remove lock + AmMutex utimer_rem_m; //list with timer deletions requests - std::queue utimer_rem; + std::vector utimer_rem; //list with expired timers base_timer utimer_expired;