summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorDavid Robillard <d@drobilla.net>2011-09-23 23:51:44 +0000
committerDavid Robillard <d@drobilla.net>2011-09-23 23:51:44 +0000
commit4cc5c82a87cf2316f425a9ea1de0fb29d0c24c8e (patch)
treed2b874fb8e7437cf7ea819fa6faca36e1c3ddc9d /src
parent41f1be0a68676f33dc1d7dfbb32c5d6440ebd4c9 (diff)
downloadingen-4cc5c82a87cf2316f425a9ea1de0fb29d0c24c8e.tar.gz
ingen-4cc5c82a87cf2316f425a9ea1de0fb29d0c24c8e.tar.bz2
ingen-4cc5c82a87cf2316f425a9ea1de0fb29d0c24c8e.zip
Fix memory leaks and errors.
git-svn-id: http://svn.drobilla.net/lad/trunk/ingen@3482 a436a847-0d15-0410-975c-d299462d15a1
Diffstat (limited to 'src')
-rw-r--r--src/client/PluginModel.cpp16
-rw-r--r--src/serialisation/Serialiser.cpp5
-rw-r--r--src/server/BufferFactory.cpp10
-rw-r--r--src/server/Engine.cpp11
-rw-r--r--src/server/EngineStore.cpp5
-rw-r--r--src/server/EngineStore.hpp18
-rw-r--r--src/server/JackDriver.cpp16
-rw-r--r--src/server/LV2BlobFeature.hpp4
-rw-r--r--src/server/LV2EventFeature.hpp4
-rw-r--r--src/server/LV2RequestRunFeature.hpp2
-rw-r--r--src/server/events/DisconnectAll.cpp5
-rw-r--r--src/shared/World.cpp3
12 files changed, 77 insertions, 22 deletions
diff --git a/src/client/PluginModel.cpp b/src/client/PluginModel.cpp
index 694e5ce0..80b78887 100644
--- a/src/client/PluginModel.cpp
+++ b/src/client/PluginModel.cpp
@@ -238,9 +238,11 @@ PluginModel::documentation() const
LilvNodes* vals = lilv_plugin_get_value(_lilv_plugin,
rdfs_comment);
- const LilvNode* val = lilv_nodes_get_first(vals);
- if (lilv_node_is_string(val)) {
- doc += lilv_node_as_string(val);
+ if (vals) {
+ const LilvNode* val = lilv_nodes_get_first(vals);
+ if (lilv_node_is_string(val)) {
+ doc += lilv_node_as_string(val);
+ }
}
lilv_node_free(rdfs_comment);
lilv_nodes_free(vals);
@@ -266,9 +268,11 @@ PluginModel::port_documentation(uint32_t index) const
LilvNodes* vals = lilv_port_get_value(_lilv_plugin,
port,
rdfs_comment);
- const LilvNode* val = lilv_nodes_get_first(vals);
- if (lilv_node_is_string(val)) {
- doc += lilv_node_as_string(val);
+ if (vals) {
+ const LilvNode* val = lilv_nodes_get_first(vals);
+ if (lilv_node_is_string(val)) {
+ doc += lilv_node_as_string(val);
+ }
}
lilv_node_free(rdfs_comment);
lilv_nodes_free(vals);
diff --git a/src/serialisation/Serialiser.cpp b/src/serialisation/Serialiser.cpp
index 4a69d597..22632810 100644
--- a/src/serialisation/Serialiser.cpp
+++ b/src/serialisation/Serialiser.cpp
@@ -124,6 +124,11 @@ Serialiser::Serialiser(Shared::World& world, SharedPtr<Shared::Store> store)
: me(new Impl(world, store))
{}
+Serialiser::~Serialiser()
+{
+ delete me;
+}
+
void
Serialiser::to_file(SharedPtr<const GraphObject> object,
const std::string& filename)
diff --git a/src/server/BufferFactory.cpp b/src/server/BufferFactory.cpp
index f725079b..f6f73fdc 100644
--- a/src/server/BufferFactory.cpp
+++ b/src/server/BufferFactory.cpp
@@ -44,6 +44,7 @@ BufferFactory::BufferFactory(Engine& engine,
BufferFactory::~BufferFactory()
{
+ _silent_buffer.reset();
free_list(_free_audio.get());
free_list(_free_control.get());
free_list(_free_event.get());
@@ -53,10 +54,11 @@ BufferFactory::~BufferFactory()
void
BufferFactory::free_list(Buffer* head)
{
- Buffer* next = head->_next;
- delete head;
- if (next)
- free_list(next);
+ while (head) {
+ Buffer* next = head->_next;
+ delete head;
+ head = next;
+ }
}
void
diff --git a/src/server/Engine.cpp b/src/server/Engine.cpp
index 3aa05eba..301d90e1 100644
--- a/src/server/Engine.cpp
+++ b/src/server/Engine.cpp
@@ -57,7 +57,6 @@ bool ThreadManager::single_threaded = true;
Engine::Engine(Ingen::Shared::World* a_world)
: _world(a_world)
, _broadcaster(new ClientBroadcaster())
- , _buffer_factory(new BufferFactory(*this, a_world->uris()))
, _control_bindings(new ControlBindings(*this))
, _maid(new Raul::Maid(event_queue_size()))
, _message_context(new MessageContext(*this))
@@ -66,9 +65,13 @@ Engine::Engine(Ingen::Shared::World* a_world)
, _quit_flag(false)
{
if (a_world->store()) {
- assert(PtrCast<EngineStore>(a_world->store()));
+ SharedPtr<EngineStore> estore = PtrCast<EngineStore>(a_world->store());
+ _buffer_factory = estore->buffer_factory().get();
} else {
- a_world->set_store(SharedPtr<Ingen::Shared::Store>(new EngineStore()));
+ _buffer_factory = new BufferFactory(*this, a_world->uris());
+ a_world->set_store(
+ SharedPtr<Ingen::Shared::Store>(
+ new EngineStore(SharedPtr<BufferFactory>(_buffer_factory))));
}
}
@@ -85,6 +88,8 @@ Engine::~Engine()
delete _maid;
delete _post_processor;
delete _node_factory;
+ delete _message_context;
+ delete _control_bindings;
delete _broadcaster;
munlockall();
diff --git a/src/server/EngineStore.cpp b/src/server/EngineStore.cpp
index ee0dc933..f47169bc 100644
--- a/src/server/EngineStore.cpp
+++ b/src/server/EngineStore.cpp
@@ -35,6 +35,11 @@ using namespace Raul;
namespace Ingen {
namespace Server {
+EngineStore::~EngineStore()
+{
+ clear();
+}
+
/** Find the Patch at the given path.
*/
PatchImpl*
diff --git a/src/server/EngineStore.hpp b/src/server/EngineStore.hpp
index ba8dd000..76a97b9c 100644
--- a/src/server/EngineStore.hpp
+++ b/src/server/EngineStore.hpp
@@ -28,10 +28,11 @@ class GraphObject;
namespace Server {
-class PatchImpl;
+class BufferFactory;
+class GraphObjectImpl;
class NodeImpl;
+class PatchImpl;
class PortImpl;
-class GraphObjectImpl;
/** Storage for all GraphObjects (tree of GraphObject's sorted by path).
*
@@ -45,6 +46,11 @@ class GraphObjectImpl;
class EngineStore : public Ingen::Shared::Store
{
public:
+ EngineStore(SharedPtr<BufferFactory> f) : _factory(f) {}
+ ~EngineStore();
+
+ SharedPtr<BufferFactory> buffer_factory() const { return _factory; }
+
PatchImpl* find_patch(const Raul::Path& path);
NodeImpl* find_node(const Raul::Path& path);
PortImpl* find_port(const Raul::Path& path);
@@ -57,6 +63,14 @@ public:
SharedPtr<Objects> remove(Objects::iterator i);
SharedPtr<Objects> remove_children(const Raul::Path& path);
SharedPtr<Objects> remove_children(Objects::iterator i);
+
+private:
+ /* This holds a reference to the BufferFactory since the objects stored
+ here refer to it, so the BufferFactory may only be deleted after the
+ EngineStore is emptied and deleted.
+ */
+
+ SharedPtr<BufferFactory> _factory;
};
} // namespace Server
diff --git a/src/server/JackDriver.cpp b/src/server/JackDriver.cpp
index cc258fb3..42e9f78a 100644
--- a/src/server/JackDriver.cpp
+++ b/src/server/JackDriver.cpp
@@ -206,6 +206,8 @@ JackDriver::~JackDriver()
if (_client)
jack_client_close(_client);
+
+ delete _jack_thread;
}
bool
@@ -322,7 +324,9 @@ JackDriver::deactivate()
_client = NULL;
}
- _jack_thread->stop();
+ delete _jack_thread;
+ _jack_thread = NULL;
+
LOG(info) << "Deactivated Jack client" << endl;
}
}
@@ -483,11 +487,13 @@ JackDriver::_process_cb(jack_nframes_t nframes)
void
JackDriver::_thread_init_cb()
{
- // Initialize thread specific data
- _jack_thread = Thread::create_for_this_thread("Jack");
- assert(&Thread::get() == _jack_thread);
+ if (_jack_thread) {
+ delete _jack_thread;
+ }
+
+ _jack_thread = &Thread::get();
+ _jack_thread->set_name("Jack");
_jack_thread->set_context(THREAD_PROCESS);
- ThreadManager::assert_thread(THREAD_PROCESS);
}
void
diff --git a/src/server/LV2BlobFeature.hpp b/src/server/LV2BlobFeature.hpp
index b66a2828..ec7c154d 100644
--- a/src/server/LV2BlobFeature.hpp
+++ b/src/server/LV2BlobFeature.hpp
@@ -36,6 +36,10 @@ struct BlobFeature : public Ingen::Shared::LV2Features::Feature {
_feature.data = data;
}
+ ~BlobFeature() {
+ free(_feature.data);
+ }
+
static LV2_Blob ref_get(LV2_Blob_Support_Data data,
LV2_Reference* ref) { return 0; }
diff --git a/src/server/LV2EventFeature.hpp b/src/server/LV2EventFeature.hpp
index 5e2f1f31..4796c6e1 100644
--- a/src/server/LV2EventFeature.hpp
+++ b/src/server/LV2EventFeature.hpp
@@ -34,6 +34,10 @@ struct EventFeature : public Ingen::Shared::LV2Features::Feature {
_feature.data = data;
}
+ ~EventFeature() {
+ free(_feature.data);
+ }
+
static uint32_t event_ref(LV2_Event_Callback_Data callback_data,
LV2_Event* event) { return 0; }
diff --git a/src/server/LV2RequestRunFeature.hpp b/src/server/LV2RequestRunFeature.hpp
index e1af0aca..a10a0eee 100644
--- a/src/server/LV2RequestRunFeature.hpp
+++ b/src/server/LV2RequestRunFeature.hpp
@@ -56,7 +56,7 @@ struct RequestRunFeature : public Ingen::Shared::LV2Features::Feature {
}
static void delete_feature(LV2_Feature* feature) {
- delete (Data*)feature->data;
+ free(feature->data);
free(feature);
}
diff --git a/src/server/events/DisconnectAll.cpp b/src/server/events/DisconnectAll.cpp
index dd694810..23db5167 100644
--- a/src/server/events/DisconnectAll.cpp
+++ b/src/server/events/DisconnectAll.cpp
@@ -129,8 +129,11 @@ DisconnectAll::pre_process()
}
for (Patch::Connections::const_iterator i = _parent->connections().begin();
- i != _parent->connections().end(); ++i) {
+ i != _parent->connections().end();) {
+ Patch::Connections::const_iterator next = i;
+ ++next;
maybe_remove_connection((ConnectionImpl*)i->second.get());
+ i = next;
}
if (!_deleting && _parent->enabled())
diff --git a/src/shared/World.cpp b/src/shared/World.cpp
index eb60a1a5..e6742c85 100644
--- a/src/shared/World.cpp
+++ b/src/shared/World.cpp
@@ -130,6 +130,9 @@ public:
virtual ~Pimpl()
{
+ serialiser.reset();
+ parser.reset();
+
local_engine.reset();
modules.clear();