summaryrefslogtreecommitdiffstats
path: root/src/server/Engine.cpp
diff options
context:
space:
mode:
authorDavid Robillard <d@drobilla.net>2012-05-09 01:14:30 +0000
committerDavid Robillard <d@drobilla.net>2012-05-09 01:14:30 +0000
commitbaeb3c1872a989b69eb89fae04f93c59b06f258e (patch)
tree83720f9c7bad7ab26c910180d8caea2fd4cb7e70 /src/server/Engine.cpp
parent4d46a232b30be99bc34e581cbc636345f77c6bc4 (diff)
downloadingen-baeb3c1872a989b69eb89fae04f93c59b06f258e.tar.gz
ingen-baeb3c1872a989b69eb89fae04f93c59b06f258e.tar.bz2
ingen-baeb3c1872a989b69eb89fae04f93c59b06f258e.zip
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
Diffstat (limited to 'src/server/Engine.cpp')
-rw-r--r--src/server/Engine.cpp41
1 files changed, 17 insertions, 24 deletions
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()) {
@@ -123,15 +125,6 @@ Engine::main_iteration()
}
void
-Engine::add_event_source(SharedPtr<EventSource> source)
-{
- // FIXME: Not thread-safe
- _maid->manage(source);
- source->_next = _event_sources;
- _event_sources = source;
-}
-
-void
Engine::set_driver(SharedPtr<Driver> driver)
{
_driver = 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<EventSource> src = _event_sources;
- SharedPtr<EventSource> 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