From baeb3c1872a989b69eb89fae04f93c59b06f258e Mon Sep 17 00:00:00 2001 From: David Robillard Date: Wed, 9 May 2012 01:14:30 +0000 Subject: Simply event interface design and make only one pre-process thread. This makes event pre-processing actually safe for multiple interfaces since multiple events will never be pre-processed simultaneously and the pre-process order is definitely the same as the execute order. git-svn-id: http://svn.drobilla.net/lad/trunk/ingen@4323 a436a847-0d15-0410-975c-d299462d15a1 --- src/server/Engine.cpp | 41 +++++++++++++++++------------------------ 1 file changed, 17 insertions(+), 24 deletions(-) (limited to 'src/server/Engine.cpp') diff --git a/src/server/Engine.cpp b/src/server/Engine.cpp index 7138d2ea..c2cc7cab 100644 --- a/src/server/Engine.cpp +++ b/src/server/Engine.cpp @@ -36,12 +36,12 @@ #include "Engine.hpp" #include "EngineStore.hpp" #include "Event.hpp" -#include "EventSource.hpp" #include "EventWriter.hpp" #include "MessageContext.hpp" #include "NodeFactory.hpp" #include "PatchImpl.hpp" #include "PostProcessor.hpp" +#include "PreProcessor.hpp" #include "ProcessContext.hpp" #include "ThreadManager.hpp" @@ -60,7 +60,9 @@ Engine::Engine(Ingen::Shared::World* a_world) , _maid(new Raul::Maid(event_queue_size())) , _message_context(new MessageContext(*this)) , _node_factory(new NodeFactory(a_world)) + , _pre_processor(new PreProcessor()) , _post_processor(new PostProcessor(*this)) + , _event_writer(new EventWriter(*this)) , _quit_flag(false) { if (a_world->store()) { @@ -122,15 +124,6 @@ Engine::main_iteration() return !_quit_flag; } -void -Engine::add_event_source(SharedPtr source) -{ - // FIXME: Not thread-safe - _maid->manage(source); - source->_next = _event_sources; - _event_sources = source; -} - void Engine::set_driver(SharedPtr driver) { @@ -235,24 +228,24 @@ Engine::deactivate() ThreadManager::single_threaded = true; } +bool +Engine::pending_events() +{ + return !_pre_processor->empty(); +} + +void +Engine::enqueue_event(Event* ev) +{ + ThreadManager::assert_not_thread(THREAD_PROCESS); + _pre_processor->event(ev); +} + void Engine::process_events(ProcessContext& context) { ThreadManager::assert_thread(THREAD_PROCESS); - - SharedPtr src = _event_sources; - SharedPtr prev = src; - for (; src; src = src->_next) { - if (!src->process(*_post_processor, context)) { - // Source is finished, remove - if (src == _event_sources) { - _event_sources = src->_next; - } else { - prev->_next = src->_next; - } - } - prev = src; - } + _pre_processor->process(*_post_processor, context); } void -- cgit v1.2.1