optimizing wheeltimer against lock contention (ref r30379)

git-svn-id: http://svn.berlios.de/svnroot/repos/sems/trunk@1791 8eb893ce-cfd4-0310-b710-fb5ebe64c474
sayer/1.4-spce2.6
Stefan Sayer 17 years ago
parent 101880a2a1
commit 1704f9cb34

@ -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<timer*> utimer_add_cp = utimer_add;
utimer_add.clear();
utimer_add_m.unlock();
for (std::vector<timer*>::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<timer*> utimer_rem_cp = utimer_rem;
utimer_rem.clear();
utimer_rem_m.unlock();
for (std::vector<timer*>::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();

@ -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<timer*> utimer_add;
std::vector<timer*> utimer_add;
// utimer remove lock
AmMutex utimer_rem_m;
//list with timer deletions requests
std::queue<timer*> utimer_rem;
std::vector<timer*> utimer_rem;
//list with expired timers
base_timer utimer_expired;

Loading…
Cancel
Save