diff options
Diffstat (limited to 'Swiften/EventLoop/SingleThreadedEventLoop.cpp')
-rw-r--r-- | Swiften/EventLoop/SingleThreadedEventLoop.cpp | 65 |
1 files changed, 65 insertions, 0 deletions
diff --git a/Swiften/EventLoop/SingleThreadedEventLoop.cpp b/Swiften/EventLoop/SingleThreadedEventLoop.cpp new file mode 100644 index 0000000..4c5e209 --- /dev/null +++ b/Swiften/EventLoop/SingleThreadedEventLoop.cpp @@ -0,0 +1,65 @@ +/* + * Copyright (c) 2010 Soren Dreijer + * Licensed under the simplified BSD license. + * See Documentation/Licenses/BSD-simplified.txt for more information. + */ + +#include "Swiften/EventLoop/SingleThreadedEventLoop.h" + +#include <boost/bind.hpp> +#include <iostream> + +#include "Swiften/Base/foreach.h" + + +namespace Swift { + +SingleThreadedEventLoop::SingleThreadedEventLoop() +: shouldShutDown_(false) +{ +} + +SingleThreadedEventLoop::~SingleThreadedEventLoop() { + if (!events_.empty()) { + std::cerr << "Warning: Pending events in SingleThreadedEventLoop at destruction time." << std::endl; + } +} + +void SingleThreadedEventLoop::waitForEvents() { + boost::unique_lock<boost::mutex> lock(eventsMutex_); + while (events_.size() == 0 && !shouldShutDown_) { + eventsAvailable_.wait(lock); + } + + if (shouldShutDown_) + throw EventLoopCanceledException(); +} + +void SingleThreadedEventLoop::handleEvents() { + // Make a copy of the list of events so we don't block any threads that post + // events while we process them. + std::vector<Event> events; + { + boost::unique_lock<boost::mutex> lock(eventsMutex_); + events.swap(events_); + } + + // Loop through all the events and handle them + foreach(const Event& event, events) { + handleEvent(event); + } +} + +void SingleThreadedEventLoop::stop() { + boost::unique_lock<boost::mutex> lock(eventsMutex_); + shouldShutDown_ = true; + eventsAvailable_.notify_one(); +} + +void SingleThreadedEventLoop::post(const Event& event) { + boost::lock_guard<boost::mutex> lock(eventsMutex_); + events_.push_back(event); + eventsAvailable_.notify_one(); +} + +} // namespace Swift |