/* * Copyright (c) 2010 Remko Tronçon * Licensed under the GNU General Public License v3. * See Documentation/Licenses/GPLv3.txt for more information. */ #include "Swiften/EventLoop/EventLoop.h" #include #include #include #include namespace Swift { EventLoop::EventLoop() : nextEventID_(0), handlingEvents_(false) { } EventLoop::~EventLoop() { } void EventLoop::handleEvent(const Event& event) { //SWIFT_LOG(debug) << "Handling event " << event.id << std::endl; if (handlingEvents_) { // We're being called recursively. Push in the list of events to // handle in the parent handleEvent() eventsToHandle_.push_back(event); return; } bool doCallback = false; { boost::lock_guard lock(eventsMutex_); std::list::iterator i = std::find(events_.begin(), events_.end(), event); if (i != events_.end()) { doCallback = true; events_.erase(i); } } if (doCallback) { handlingEvents_ = true; try { event.callback(); } catch (const boost::bad_function_call&) { SWIFT_LOG(error) << "Invalid function call" << std::endl; } // Process events that were passed to handleEvent during the callback // (i.e. through recursive calls of handleEvent) while (!eventsToHandle_.empty()) { Event nextEvent = eventsToHandle_.front(); eventsToHandle_.pop_front(); try { nextEvent.callback(); } catch (const boost::bad_function_call&) { SWIFT_LOG(error) << "Invalid function call" << std::endl; } } handlingEvents_ = false; } } void EventLoop::postEvent(boost::function callback, boost::shared_ptr owner) { Event event(owner, callback); { boost::lock_guard lock(eventsMutex_); event.id = nextEventID_; nextEventID_++; events_.push_back(event); } //SWIFT_LOG(debug) << "Posting event " << event.id << std::endl; post(event); } void EventLoop::removeEventsFromOwner(boost::shared_ptr owner) { boost::lock_guard lock(eventsMutex_); events_.remove_if(HasOwner(owner)); } }