diff --git a/erizo/src/erizo/thread/Scheduler.cpp b/erizo/src/erizo/thread/Scheduler.cpp index a5fba22fdd..d86b3e994a 100644 --- a/erizo/src/erizo/thread/Scheduler.cpp +++ b/erizo/src/erizo/thread/Scheduler.cpp @@ -29,8 +29,10 @@ void Scheduler::serviceQueue() { new_task_scheduled_.wait(lock); } + current_timeout_ = task_queue_.begin()->first; while (!stop_requested_ && !task_queue_.empty() && - new_task_scheduled_.wait_until(lock, task_queue_.begin()->first) != std::cv_status::timeout) { + new_task_scheduled_.wait_until(lock, current_timeout_) != std::cv_status::timeout) { + boost::thread::yield(); } if (stop_requested_) { break; @@ -43,6 +45,10 @@ void Scheduler::serviceQueue() { Function f = task_queue_.begin()->second; task_queue_.erase(task_queue_.begin()); + if (!task_queue_.empty()) { + current_timeout_ = task_queue_.begin()->first; + } + lock.unlock(); f(); lock.lock(); diff --git a/erizo/src/erizo/thread/Scheduler.h b/erizo/src/erizo/thread/Scheduler.h index d62c44b79a..cb44a361e4 100644 --- a/erizo/src/erizo/thread/Scheduler.h +++ b/erizo/src/erizo/thread/Scheduler.h @@ -37,6 +37,7 @@ class Scheduler { private: std::multimap task_queue_; + std::chrono::system_clock::time_point current_timeout_; std::condition_variable new_task_scheduled_; mutable std::mutex new_task_mutex_; std::atomic n_threads_servicing_queue_;