From fbae5f5ffda189d178c3e06407f6e17decc7f18e Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Fri, 20 Jan 2017 13:45:14 +0100 Subject: [PATCH] Free dead request-buffers This partially plugs a memory leak of event-loops. --- libs/pbd/pbd/abstract_ui.cc | 15 +++++++++++++-- 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::AbstractUI (const string& name) } } +template +AbstractUI::~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 void AbstractUI::register_thread (pthread_t thread_id, string thread_name, uint32_t num_requests) { @@ -113,7 +124,7 @@ AbstractUI::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::call_slot (InvalidationRecord* invalidation, const bo template void* AbstractUI::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&);