diff options
author | David Robillard <d@drobilla.net> | 2011-08-20 20:59:48 +0000 |
---|---|---|
committer | David Robillard <d@drobilla.net> | 2011-08-20 20:59:48 +0000 |
commit | 769fd5a2c60ef39f0af68664b35c99f90b8d715b (patch) | |
tree | cfaeacafbeba957a349bc1511da86c988685f6e2 /src/server/PostProcessor.cpp | |
parent | c2d440f132983a1068caa23e6c3832ddecbabaa9 (diff) | |
download | ingen-769fd5a2c60ef39f0af68664b35c99f90b8d715b.tar.gz ingen-769fd5a2c60ef39f0af68664b35c99f90b8d715b.tar.bz2 ingen-769fd5a2c60ef39f0af68664b35c99f90b8d715b.zip |
Fix crash when sending port notifications (fix #741).
Use a simpler system for port change notifications (abusing Event, which is virtual and thus can't be ringbuffered safely, was the cause of this crash).
git-svn-id: http://svn.drobilla.net/lad/trunk/ingen@3438 a436a847-0d15-0410-975c-d299462d15a1
Diffstat (limited to 'src/server/PostProcessor.cpp')
-rw-r--r-- | src/server/PostProcessor.cpp | 16 |
1 files changed, 7 insertions, 9 deletions
diff --git a/src/server/PostProcessor.cpp b/src/server/PostProcessor.cpp index 3364322a..7c756812 100644 --- a/src/server/PostProcessor.cpp +++ b/src/server/PostProcessor.cpp @@ -21,10 +21,10 @@ #include "Driver.hpp" #include "Engine.hpp" +#include "Notification.hpp" #include "PostProcessor.hpp" #include "ProcessContext.hpp" #include "QueuedEvent.hpp" -#include "events/SendPortValue.hpp" using namespace std; using namespace Raul; @@ -35,14 +35,11 @@ namespace Server { PostProcessor::PostProcessor(Engine& engine) : _engine(engine) , _max_time(0) - , _event_buffer_size(sizeof(Events::SendPortValue)) // FIXME: make generic - , _event_buffer((uint8_t*)malloc(_event_buffer_size)) { } PostProcessor::~PostProcessor() { - free(_event_buffer); } void @@ -76,13 +73,14 @@ PostProcessor::process() /* Process audio thread generated events */ while (true) { Driver* driver = _engine.driver(); - if (driver && driver->context().event_sink().read(_event_buffer_size, _event_buffer)) { - if (((Event*)_event_buffer)->time() > end_time) { - warn << "Lost event with time " - << ((Event*)_event_buffer)->time() << " > " << end_time << endl; + Notification note; + if (driver && driver->context().event_sink().peek(sizeof(note), ¬e)) { + if (note.time > end_time) { break; } - ((Event*)_event_buffer)->post_process(); + + note.post_process(_engine); + driver->context().event_sink().skip(sizeof(note)); } else { break; } |