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 | 
 Swift
 Swift