summaryrefslogtreecommitdiff
path: root/libs/pbd/pbd
diff options
context:
space:
mode:
authorRobin Gareus <robin@gareus.org>2017-01-20 13:45:14 +0100
committerRobin Gareus <robin@gareus.org>2017-01-20 13:53:59 +0100
commitfbae5f5ffda189d178c3e06407f6e17decc7f18e (patch)
tree5f5fbe0e1cefc0c51972c7ed379c4b24bb4febfa /libs/pbd/pbd
parentd6106b22cb755f0d5087c8b1b74b2ca3bd41e350 (diff)
Free dead request-buffers
This partially plugs a memory leak of event-loops.
Diffstat (limited to 'libs/pbd/pbd')
-rw-r--r--libs/pbd/pbd/abstract_ui.cc15
-rw-r--r--libs/pbd/pbd/abstract_ui.h2
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()>&);