Introduced a libev async watcher specifically for updating timers. Review: https://reviews.apache.org/r/27502
Project: http://git-wip-us.apache.org/repos/asf/mesos/repo Commit: http://git-wip-us.apache.org/repos/asf/mesos/commit/18cc45f1 Tree: http://git-wip-us.apache.org/repos/asf/mesos/tree/18cc45f1 Diff: http://git-wip-us.apache.org/repos/asf/mesos/diff/18cc45f1 Branch: refs/heads/master Commit: 18cc45f1f0c27e1766be9c1227c24d63c14bbcb0 Parents: e1ef91f Author: Benjamin Hindman <[email protected]> Authored: Sun Nov 2 16:49:22 2014 -0800 Committer: Benjamin Hindman <[email protected]> Committed: Sat Nov 15 16:25:58 2014 -0800 ---------------------------------------------------------------------- 3rdparty/libprocess/src/process.cpp | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/mesos/blob/18cc45f1/3rdparty/libprocess/src/process.cpp ---------------------------------------------------------------------- diff --git a/3rdparty/libprocess/src/process.cpp b/3rdparty/libprocess/src/process.cpp index 2282e9b..a0b4ca0 100644 --- a/3rdparty/libprocess/src/process.cpp +++ b/3rdparty/libprocess/src/process.cpp @@ -449,9 +449,14 @@ static ProcessManager* process_manager = NULL; // Event loop. static struct ev_loop* loop = NULL; -// Asynchronous watcher for interrupting loop. +// Asynchronous watcher for interrupting loop to specifically deal +// with IO watchers and functions (via run_in_event_loop). static ev_async async_watcher; +// Asynchronous watcher for interrupting loop to specifically deal +// with updating timers. +static ev_async async_update_timer_watcher; + // Watcher for timeouts. static ev_timer timeouts_watcher; @@ -609,7 +614,7 @@ void Clock::resume() clock::settling = false; clock::currents->clear(); update_timer = true; - ev_async_send(loop, &async_watcher); + ev_async_send(loop, &async_update_timer_watcher); } } } @@ -624,7 +629,7 @@ void Clock::advance(const Duration& duration) VLOG(2) << "Clock advanced (" << duration << ") to " << clock::current; if (!update_timer) { update_timer = true; - ev_async_send(loop, &async_watcher); + ev_async_send(loop, &async_update_timer_watcher); } } } @@ -655,7 +660,7 @@ void Clock::update(const Time& time) VLOG(2) << "Clock updated to " << clock::current; if (!update_timer) { update_timer = true; - ev_async_send(loop, &async_watcher); + ev_async_send(loop, &async_update_timer_watcher); } } } @@ -866,7 +871,11 @@ void handle_async(struct ev_loop* loop, ev_async* _, int revents) functions->pop(); } } +} + +void handle_async_update_timer(struct ev_loop* loop, ev_async* _, int revents) +{ synchronized (timeouts) { if (update_timer) { if (!timeouts->empty()) { @@ -1619,6 +1628,9 @@ void initialize(const string& delegate) ev_async_init(&async_watcher, handle_async); ev_async_start(loop, &async_watcher); + ev_async_init(&async_update_timer_watcher, handle_async_update_timer); + ev_async_start(loop, &async_update_timer_watcher); + ev_timer_init(&timeouts_watcher, handle_timeouts, 0., 2100000.0); ev_timer_again(loop, &timeouts_watcher); @@ -3226,7 +3238,7 @@ Timer Clock::timer( // Need to interrupt the loop to update/set timer repeat. (*timeouts)[timer.timeout().time()].push_back(timer); update_timer = true; - ev_async_send(loop, &async_watcher); + ev_async_send(loop, &async_update_timer_watcher); } else { // Timer repeat is adequate, just add the timeout. CHECK(timeouts->size() >= 1);
