Author: rco
Date: 2009-01-09 10:55:37 +0100 (Fri, 09 Jan 2009)
New Revision: 1224
Modified:
trunk/core/plug-in/sipctrl/wheeltimer.cpp
trunk/core/plug-in/sipctrl/wheeltimer.h
Log:
- fixes a race condition between timer insertion and deletion.
Thx to Peter Loeppky for contributing this path.
Modified: trunk/core/plug-in/sipctrl/wheeltimer.cpp
===================================================================
--- trunk/core/plug-in/sipctrl/wheeltimer.cpp 2009-01-02 15:46:26 UTC (rev
1223)
+++ trunk/core/plug-in/sipctrl/wheeltimer.cpp 2009-01-09 09:55:37 UTC (rev
1224)
@@ -64,17 +64,17 @@
void wheeltimer::insert_timer(timer* t)
{
//add new timer to user request list
- utimer_add_m.lock();
+ utimer_m.lock();
utimer_add.push(t);
- utimer_add_m.unlock();
+ utimer_m.unlock();
}
void wheeltimer::remove_timer(timer* t)
{
//add new timer to user request list
- utimer_rem_m.lock();
+ utimer_m.lock();
utimer_rem.push(t);
- utimer_rem_m.unlock();
+ utimer_m.unlock();
}
void wheeltimer::run()
@@ -155,20 +155,18 @@
update_wheel(i);
// Check for timer insertion requests
- utimer_add_m.lock();
+ utimer_m.lock();
while(!utimer_add.empty()) {
place_timer(utimer_add.front());
utimer_add.pop();
}
- utimer_add_m.unlock();
// Check for timer deletion requests
- utimer_rem_m.lock();
while(!utimer_rem.empty()) {
delete_timer(utimer_rem.front());
utimer_rem.pop();
}
- utimer_rem_m.unlock();
+ utimer_m.unlock();
//check for expired timer to process
process_current_timers();
Modified: trunk/core/plug-in/sipctrl/wheeltimer.h
===================================================================
--- trunk/core/plug-in/sipctrl/wheeltimer.h 2009-01-02 15:46:26 UTC (rev
1223)
+++ trunk/core/plug-in/sipctrl/wheeltimer.h 2009-01-09 09:55:37 UTC (rev
1224)
@@ -89,13 +89,14 @@
//the timer wheel
base_timer wheels[WHEELS][ELMTS_PER_WHEEL];
+ // utimer add/remove lock
+ AmMutex utimer_m;
+
//list with timer insertions requests
std::queue<timer*> utimer_add;
- AmMutex utimer_add_m;
//list with timer deletions requests
std::queue<timer*> utimer_rem;
- AmMutex utimer_rem_m;
//list with expired timers
base_timer utimer_expired;
_______________________________________________
Semsdev mailing list
[email protected]
http://lists.iptel.org/mailman/listinfo/semsdev