diff options
author | dreijer <dreijer@echobit.net> | 2010-11-12 18:33:40 (GMT) |
---|---|---|
committer | Kevin Smith <git@kismith.co.uk> | 2011-11-03 18:49:22 (GMT) |
commit | 7b0795215f601a9561dbedbed3af32dbe9aba032 (patch) | |
tree | 554a6693de362fb3403a44a586f48865c4d949bf /Swiften/EventLoop/SingleThreadedEventLoop.cpp | |
parent | 16d50c0df983e96a28a6572da27b3633b40a41d7 (diff) | |
download | swift-contrib-7b0795215f601a9561dbedbed3af32dbe9aba032.zip swift-contrib-7b0795215f601a9561dbedbed3af32dbe9aba032.tar.bz2 |
* Added Schannel support.
License: This patch is BSD-licensed, see http://www.opensource.org/licenses/bsd-license.php
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 |