namespace moof {
-enum registry_action
+bool comp(timer* a, timer* b)
{
- lookup,
- set
-};
+ return a->expiration() < b->expiration();
+}
-static uint32_t call_registry(runloop*& runloop, registry_action action)
+void runloop::run_once()
{
#if ENABLE_THREADS
- typedef stlplus::hash<uint32_t,moof::runloop*,hash_function> table_t;
- static table_t table;
-
- uint32_t thread_id = thread::current_identifier();
-
- MOOF_DECLARE_STATIC_MUTEX(table_mutex);
- MOOF_MUTEX_LOCK(table_mutex);
+ thread_id_ = thread::current_identifier();
+#endif
- switch (action)
+ //log_debug("------------------------------------");
+ //scalar next_event = SCALAR(0.0);
{
- case set:
- {
- log_info("registering runloop", runloop, "for thread", thread_id);
- if (runloop) table[thread_id] = runloop;
- else table.erase(thread_id);
- break;
- }
+ MOOF_MUTEX_LOCK(timers_mutex_);
- case lookup:
+ for (timers_it_ = timers_.begin();
+ timers_it_ != timers_.end();
+ ++timers_it_)
{
- table_t::iterator it = table.find(thread_id);
- if (it != table.end()) runloop = (*it).second;
- else log_warning("runloop is not in registry for thread", thread_id);
- break;
+ (*timers_it_)->fire_if_expired();
}
- }
- return thread_id;
-#else
- return thread::current_identifier();
-#endif
-}
-
-bool comp(timer* a, timer* b)
-{
- return a->expiration() < b->expiration();
+ std::sort(timers_.begin(), timers_.end(), comp);
+ //next_event = timers_[0]->expiration();
+ }
}
int runloop::run()
{
-#if ENABLE_THREADS
- runloop* runloop = this;
- thread_id_ = call_registry(runloop, set);
-#endif
-
stop_ = false;
while (!stop_)
{
- 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();
-
- //for (timers_it_ = timers_.begin();
- //timers_it_ != timers_.end();
- //++timers_it_)
- //{
- //scalar absolute = (*timers_it_)->fire_if_expired();
- //if (next_event == SCALAR(0.0) ||
- //(absolute != SCALAR(0.0) && absolute < next_event))
- //{
- //next_event = absolute;
- //}
- //}
- }
- timer::sleep(next_event, timer::absolute);
+ run_once();
+ //timer::sleep(next_event, timer::absolute);
+ timer::sleep(SCALAR(0.0));
}
return code_;
}
-runloop::~runloop()
-{
- runloop* runloop = 0;
- call_registry(runloop, set);
-}
-
-
void runloop::stop(int code)
{
code_ = code;
}
-runloop* runloop::current()
-{
- runloop* runloop;
- call_registry(runloop, lookup);
- return runloop;
-}
-
-
void runloop::add_timer(timer& timer)
{
#if ENABLE_THREADS