summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Robillard <d@drobilla.net>2008-12-22 04:42:37 +0000
committerDavid Robillard <d@drobilla.net>2008-12-22 04:42:37 +0000
commitcdccf89368fe6851ed74a651baf1cfcbaaccfb07 (patch)
tree5b6b0515143bd33b1c1269aafa17eb154551527a
parentc349af8e91937111579de7b5fc1e9e2b4807a7c9 (diff)
downloadingen-cdccf89368fe6851ed74a651baf1cfcbaaccfb07.tar.gz
ingen-cdccf89368fe6851ed74a651baf1cfcbaaccfb07.tar.bz2
ingen-cdccf89368fe6851ed74a651baf1cfcbaaccfb07.zip
Fix crash when deleting ports that send lots of broadcast events (e.g. a control rate LFO).
git-svn-id: http://svn.drobilla.net/lad/trunk/ingen@1904 a436a847-0d15-0410-975c-d299462d15a1
-rw-r--r--src/engine/PostProcessor.cpp33
1 files changed, 16 insertions, 17 deletions
diff --git a/src/engine/PostProcessor.cpp b/src/engine/PostProcessor.cpp
index 9543a712..b90f7ddc 100644
--- a/src/engine/PostProcessor.cpp
+++ b/src/engine/PostProcessor.cpp
@@ -46,14 +46,25 @@ PostProcessor::process()
{
const FrameTime end_time = _max_time.get();
- /* Note the normal (pre-processed client originated) events must
- * be sent first, since they could have e.g. created a port which
- * is by now inserted, running, and may broadcast something to
- * the client. If the broadcast happened first the client would
- * not yet know about the port's existance. */
+ /* FIXME: The order here is a bit tricky: if the normal events are
+ * processed first, then a deleted port may still have a pending
+ * broadcast event which will segfault if executed afterwards.
+ * If it's the other way around, broadcasts will be sent for
+ * ports the client doesn't even know about yet... */
/* FIXME: process events from all threads if parallel */
+ /* Process audio thread generated events */
+ while (_engine.audio_driver()->context().event_sink().read(
+ _event_buffer_size, _event_buffer)) {
+ if (((Event*)_event_buffer)->time() > end_time) {
+ cerr << "WARNING: Lost event with time "
+ << ((Event*)_event_buffer)->time() << " > " << end_time << endl;
+ break;
+ }
+ ((Event*)_event_buffer)->post_process();
+ }
+
/* Process normal events */
Raul::List<Event*>::Node* n = _events.head();
while (n) {
@@ -66,18 +77,6 @@ PostProcessor::process()
delete n;
n = next;
}
-
- /* Process audio thread generated events */
- while (_engine.audio_driver()->context().event_sink().read(
- _event_buffer_size, _event_buffer)) {
- if (((Event*)_event_buffer)->time() > end_time) {
- cerr << "WARNING: Lost event with time "
- << ((Event*)_event_buffer)->time() << " > " << end_time << endl;
- break;
- }
- ((Event*)_event_buffer)->post_process();
- }
-
}