Free dead request-buffers
authorRobin Gareus <robin@gareus.org>
Fri, 20 Jan 2017 12:45:14 +0000 (13:45 +0100)
committerRobin Gareus <robin@gareus.org>
Fri, 20 Jan 2017 12:53:59 +0000 (13:53 +0100)
This partially plugs a memory leak of event-loops.

libs/pbd/pbd/abstract_ui.cc
libs/pbd/pbd/abstract_ui.h

index 4c36445848d50eec9026267714de56a05576181f..bb44b279fa7c4240cdb4546ae73d922e35d098ce 100644 (file)
@@ -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;
 }
index 072de9b4c90d0debf0d2bbb327e3eba47c338a35..89bc41e185af44e755ee20bc5815619d0ba6396f 100644 (file)
@@ -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()>&);