/*] Copyright (c) 2009-2010, Charles McGarvey [************************** **] All rights reserved. * * vi:ts=4 sw=4 tw=75 * * Distributable under the terms and conditions of the 2-clause BSD license; * see the file COPYING for a complete text of the license. * **************************************************************************/ #include "config.h" #include #include "hash.hh" #include "log.hh" #include "runloop.hh" #include "timer.hh" namespace moof { bool comp(timer* a, timer* b) { return a->expiration() < b->expiration(); } void runloop::run_once() { #if ENABLE_THREADS thread_id_ = thread::current_identifier(); #endif //log_debug("------------------------------------"); //scalar next_event = SCALAR(0.0); { MOOF_MUTEX_LOCK(timers_mutex_); for (timers_it_ = timers_.begin(); timers_it_ != timers_.end(); ++timers_it_) { (*timers_it_)->fire_if_expired(); } std::sort(timers_.begin(), timers_.end(), comp); //next_event = timers_[0]->expiration(); } } int runloop::run() { stop_ = false; while (!stop_) { run_once(); //timer::sleep(next_event, timer::absolute); timer::sleep(SCALAR(0.0)); } return code_; } void runloop::stop(int code) { code_ = code; stop_ = true; } void runloop::add_timer(timer& timer) { #if ENABLE_THREADS if (thread_id_ != thread::current_identifier()) { MOOF_MUTEX_LOCK(timers_mutex_); timers_.push_back(&timer); timers_it_ = timers_.end(); } else #endif { timers_.push_back(&timer); timers_it_ = timers_.end(); } } void runloop::remove_timer(timer& timer) { #if ENABLE_THREADS if (thread_id_ != thread::current_identifier()) { MOOF_MUTEX_LOCK(timers_mutex_); timers_.erase(std::find(timers_.begin(), timers_.end(), &timer)); timers_it_ = timers_.end(); } else #endif { timers_.erase(std::find(timers_.begin(), timers_.end(), &timer)); timers_it_ = timers_.end(); } } } // namespace moof