From: Robin Gareus Date: Thu, 28 Apr 2016 19:37:18 +0000 (+0200) Subject: flush pending Session Events at session close X-Git-Tag: 5.0-pre0~776 X-Git-Url: https://main.carlh.net/gitweb/?a=commitdiff_plain;ds=sidebyside;h=17d782829e9321d5a1084851834356edd12a4bc3;p=ardour.git flush pending Session Events at session close This prevents a memory leak: The session is closed. The session-butler drops memory pool trash. The Engine keeps running. Once the AudioEngine is taken down (sample-rate switch, or at exit), the backend process-thread is terminated but there is no trash-can anymore. If there are unprocessed SessionEvents, this calls free_per_thread_pool() -> cp->parent()->add_to_trash (cp). "parent()" in this case the trash-can the butler emptied. --- diff --git a/libs/ardour/session.cc b/libs/ardour/session.cc index ef5ace53e8..68c7d3957f 100644 --- a/libs/ardour/session.cc +++ b/libs/ardour/session.cc @@ -745,6 +745,42 @@ Session::destroy () delete midi_clock; delete _tempo_map; + /* clear event queue, the session is gone, nobody is interested in + * those anymore, but they do leak memory if not removed + */ + while (!immediate_events.empty ()) { + Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ()); + SessionEvent *ev = immediate_events.front (); + DEBUG_TRACE (DEBUG::SessionEvents, string_compose ("Drop event: %1\n", enum_2_string (ev->type))); + immediate_events.pop_front (); + bool remove = true; + bool del = true; + switch (ev->type) { + case SessionEvent::AutoLoop: + case SessionEvent::AutoLoopDeclick: + case SessionEvent::Skip: + case SessionEvent::PunchIn: + case SessionEvent::PunchOut: + case SessionEvent::StopOnce: + case SessionEvent::RangeStop: + case SessionEvent::RangeLocate: + remove = false; + del = false; + break; + case SessionEvent::RealTimeOperation: + process_rtop (ev); + del = false; + default: + break; + } + if (remove) { + del = del && !_remove_event (ev); + } + if (del) { + delete ev; + } + } + DEBUG_TRACE (DEBUG::Destruction, "Session::destroy() done\n"); #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS