diff options
Diffstat (limited to 'Swiften/EventLoop/SimpleEventLoop.cpp')
-rw-r--r-- | Swiften/EventLoop/SimpleEventLoop.cpp | 40 |
1 files changed, 13 insertions, 27 deletions
diff --git a/Swiften/EventLoop/SimpleEventLoop.cpp b/Swiften/EventLoop/SimpleEventLoop.cpp index 09b84dc..0bc06c9 100644 --- a/Swiften/EventLoop/SimpleEventLoop.cpp +++ b/Swiften/EventLoop/SimpleEventLoop.cpp @@ -1,73 +1,59 @@ /* - * Copyright (c) 2010 Isode Limited. + * Copyright (c) 2010-2015 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ #include <Swiften/EventLoop/SimpleEventLoop.h> #include <boost/bind.hpp> -#include <iostream> #include <Swiften/Base/foreach.h> - namespace Swift { -SimpleEventLoop::SimpleEventLoop() : isRunning_(true) { +SimpleEventLoop::SimpleEventLoop() : isRunning_(true), eventAvailable_(false) { } SimpleEventLoop::~SimpleEventLoop() { - if (!events_.empty()) { - std::cerr << "Warning: Pending events in SimpleEventLoop at destruction time" << std::endl; - } } void SimpleEventLoop::doRun(bool breakAfterEvents) { while (isRunning_) { - std::vector<Event> events; { - boost::unique_lock<boost::mutex> lock(eventsMutex_); - while (events_.empty()) { - eventsAvailable_.wait(lock); + boost::unique_lock<boost::mutex> lock(eventAvailableMutex_); + while (!eventAvailable_) { + eventAvailableCondition_.wait(lock); } - events.swap(events_); - } - foreach(const Event& event, events) { - handleEvent(event); + + eventAvailable_ = false; } + runOnce(); if (breakAfterEvents) { return; } } } void SimpleEventLoop::runOnce() { - std::vector<Event> events; - { - boost::unique_lock<boost::mutex> lock(eventsMutex_); - events.swap(events_); - } - foreach(const Event& event, events) { - handleEvent(event); - } + handleNextEvent(); } void SimpleEventLoop::stop() { postEvent(boost::bind(&SimpleEventLoop::doStop, this)); } void SimpleEventLoop::doStop() { isRunning_ = false; } -void SimpleEventLoop::post(const Event& event) { +void SimpleEventLoop::eventPosted() { { - boost::lock_guard<boost::mutex> lock(eventsMutex_); - events_.push_back(event); + boost::unique_lock<boost::mutex> lock(eventAvailableMutex_); + eventAvailable_ = true; } - eventsAvailable_.notify_one(); + eventAvailableCondition_.notify_one(); } } |