summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Robillard <d@drobilla.net>2013-12-30 21:46:21 +0000
committerDavid Robillard <d@drobilla.net>2013-12-30 21:46:21 +0000
commitf76b94c277c34855579486851517d03c314c8fde (patch)
tree86bcd909290b39ced56132332edf2e738d964418
parentd88c1ffb6a725ba66ca85ad2410e4f45ddb7afbc (diff)
downloadingen-f76b94c277c34855579486851517d03c314c8fde.tar.gz
ingen-f76b94c277c34855579486851517d03c314c8fde.tar.bz2
ingen-f76b94c277c34855579486851517d03c314c8fde.zip
Fix occasional crashes and deadlocks on exit.
git-svn-id: http://svn.drobilla.net/lad/trunk/ingen@5229 a436a847-0d15-0410-975c-d299462d15a1
-rw-r--r--src/World.cpp3
-rw-r--r--src/server/Engine.cpp11
-rw-r--r--src/server/events/SetPortValue.hpp2
3 files changed, 12 insertions, 4 deletions
diff --git a/src/World.cpp b/src/World.cpp
index 1e0f82c0..c91724a6 100644
--- a/src/World.cpp
+++ b/src/World.cpp
@@ -165,13 +165,12 @@ public:
serialiser.reset();
parser.reset();
interface.reset();
- store.reset();
engine.reset();
+ store.reset();
interface_factories.clear();
script_runners.clear();
-
delete rdf_world;
delete lv2_features;
delete uris;
diff --git a/src/server/Engine.cpp b/src/server/Engine.cpp
index a7d77736..1f6fd70c 100644
--- a/src/server/Engine.cpp
+++ b/src/server/Engine.cpp
@@ -16,6 +16,8 @@
#include <sys/mman.h>
+#include <limits>
+
#include "lv2/lv2plug.in/ns/ext/buf-size/buf-size.h"
#include "events/CreatePort.hpp"
@@ -95,6 +97,13 @@ Engine::~Engine()
_root_graph = NULL;
deactivate();
+ // Process all pending events
+ const FrameTime end = std::numeric_limits<FrameTime>::max();
+ _process_context.locate(_process_context.end(), end - _process_context.end());
+ _post_processor->set_end_time(end);
+ _pre_processor->process(_process_context, *_post_processor, false);
+ _post_processor->process();
+
const SPtr<Store> store = this->store();
if (store) {
for (auto& s : *store.get()) {
@@ -107,7 +116,6 @@ Engine::~Engine()
_world->set_store(SPtr<Ingen::Store>());
- delete _maid;
delete _pre_processor;
delete _post_processor;
delete _block_factory;
@@ -115,6 +123,7 @@ Engine::~Engine()
delete _broadcaster;
delete _event_writer;
delete _worker;
+ delete _maid;
_driver.reset();
diff --git a/src/server/events/SetPortValue.hpp b/src/server/events/SetPortValue.hpp
index 0c4e8b11..852c694e 100644
--- a/src/server/events/SetPortValue.hpp
+++ b/src/server/events/SetPortValue.hpp
@@ -54,7 +54,7 @@ private:
void apply(Context& context);
PortImpl* _port;
- const Atom _value;
+ const Atom _value;
ControlBindings::Key _binding;
};