diff options
author | Robin Gareus <robin@gareus.org> | 2017-01-20 13:45:14 +0100 |
---|---|---|
committer | Robin Gareus <robin@gareus.org> | 2017-01-20 13:53:59 +0100 |
commit | fbae5f5ffda189d178c3e06407f6e17decc7f18e (patch) | |
tree | 5f5fbe0e1cefc0c51972c7ed379c4b24bb4febfa /libs | |
parent | d6106b22cb755f0d5087c8b1b74b2ca3bd41e350 (diff) |
Free dead request-buffers
This partially plugs a memory leak of event-loops.
Diffstat (limited to 'libs')
-rw-r--r-- | libs/pbd/pbd/abstract_ui.cc | 15 | ||||
-rw-r--r-- | libs/pbd/pbd/abstract_ui.h | 2 |
2 files changed, 14 insertions, 3 deletions
diff --git a/libs/pbd/pbd/abstract_ui.cc b/libs/pbd/pbd/abstract_ui.cc index 4c36445848..bb44b279fa 100644 --- a/libs/pbd/pbd/abstract_ui.cc +++ b/libs/pbd/pbd/abstract_ui.cc @@ -85,6 +85,17 @@ AbstractUI<RequestObject>::AbstractUI (const string& name) } } +template <typename RequestObject> +AbstractUI<RequestObject>::~AbstractUI () +{ + for (RequestBufferMapIterator i = request_buffers.begin(); i != request_buffers.end(); ++i) { + if ((*i).second->dead) { + EventLoop::remove_request_buffer_from_map ((*i).second); + delete (*i).second; + } + } +} + template <typename RequestObject> void AbstractUI<RequestObject>::register_thread (pthread_t thread_id, string thread_name, uint32_t num_requests) { @@ -113,7 +124,7 @@ AbstractUI<RequestObject>::register_thread (pthread_t thread_id, string thread_n DEBUG_TRACE (PBD::DEBUG::AbstractUI, string_compose ("create new request buffer for %1 in %2\n", thread_name, event_loop_name())); - b = new RequestBuffer (num_requests); + b = new RequestBuffer (num_requests); // XXX leaks /* set this thread's per_thread_request_buffer to this new queue/ringbuffer. remember that only this thread will get this queue when it calls per_thread_request_buffer.get() @@ -469,7 +480,7 @@ AbstractUI<RequestObject>::call_slot (InvalidationRecord* invalidation, const bo template<typename RequestObject> void* AbstractUI<RequestObject>::request_buffer_factory (uint32_t num_requests) { - RequestBuffer* mcr = new RequestBuffer (num_requests); // leaks + RequestBuffer* mcr = new RequestBuffer (num_requests); // XXX leaks per_thread_request_buffer.set (mcr); return mcr; } diff --git a/libs/pbd/pbd/abstract_ui.h b/libs/pbd/pbd/abstract_ui.h index 072de9b4c9..89bc41e185 100644 --- a/libs/pbd/pbd/abstract_ui.h +++ b/libs/pbd/pbd/abstract_ui.h @@ -56,7 +56,7 @@ class ABSTRACT_UI_API AbstractUI : public BaseUI { public: AbstractUI (const std::string& name); - virtual ~AbstractUI() {} + virtual ~AbstractUI(); void register_thread (pthread_t, std::string, uint32_t num_requests); void call_slot (EventLoop::InvalidationRecord*, const boost::function<void()>&); |