Prevent crash in pool destruction during session teardown.
git-svn-id: svn://localhost/ardour2/branches/3.0@6905 d708f5d6-7413-0410-9779-e7cbd77b26cf
This commit is contained in:
@@ -49,6 +49,7 @@ class Butler : public SessionHandleRef
|
||||
void stop();
|
||||
void wait_until_finished();
|
||||
bool transport_work_requested() const;
|
||||
void drop_references ();
|
||||
|
||||
float read_data_rate() const; ///< in usec
|
||||
float write_data_rate() const;
|
||||
|
||||
@@ -428,5 +428,12 @@ Butler::empty_pool_trash ()
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
Butler::drop_references ()
|
||||
{
|
||||
SessionEvent::pool->set_trash (0);
|
||||
}
|
||||
|
||||
|
||||
} // namespace ARDOUR
|
||||
|
||||
|
||||
@@ -229,6 +229,7 @@ Session::destroy ()
|
||||
|
||||
Stateful::loading_state_version = 0;
|
||||
|
||||
_butler->drop_references ();
|
||||
delete _butler;
|
||||
delete midi_control_ui;
|
||||
|
||||
|
||||
@@ -111,10 +111,7 @@ class PerThreadPool
|
||||
void create_per_thread_pool (std::string name, unsigned long item_size, unsigned long nitems);
|
||||
CrossThreadPool* per_thread_pool ();
|
||||
|
||||
void set_trash (RingBuffer<CrossThreadPool*>* t) {
|
||||
_trash = t;
|
||||
}
|
||||
|
||||
void set_trash (RingBuffer<CrossThreadPool*>* t);
|
||||
void add_to_trash (CrossThreadPool *);
|
||||
|
||||
private:
|
||||
@@ -122,8 +119,10 @@ class PerThreadPool
|
||||
std::string _name;
|
||||
unsigned long _item_size;
|
||||
unsigned long _nitems;
|
||||
|
||||
/** mutex to protect either changes to the _trash variable, or writes to the RingBuffer */
|
||||
Glib::Mutex _trash_mutex;
|
||||
RingBuffer<CrossThreadPool*>* _trash;
|
||||
Glib::Mutex _trash_write_mutex;
|
||||
};
|
||||
|
||||
#endif // __qm_pool_h__
|
||||
|
||||
@@ -198,10 +198,19 @@ PerThreadPool::per_thread_pool ()
|
||||
return p;
|
||||
}
|
||||
|
||||
void
|
||||
PerThreadPool::set_trash (RingBuffer<CrossThreadPool*>* t)
|
||||
{
|
||||
Glib::Mutex::Lock lm (_trash_mutex);
|
||||
_trash = t;
|
||||
}
|
||||
|
||||
/** Add a CrossThreadPool to our trash, if we have one. If not, a warning is emitted. */
|
||||
void
|
||||
PerThreadPool::add_to_trash (CrossThreadPool* p)
|
||||
{
|
||||
Glib::Mutex::Lock lm (_trash_mutex);
|
||||
|
||||
if (!_trash) {
|
||||
warning << "Pool " << p->name() << " has no trash collector; a memory leak has therefore occurred" << endmsg;
|
||||
return;
|
||||
@@ -211,7 +220,6 @@ PerThreadPool::add_to_trash (CrossThreadPool* p)
|
||||
can only be one writer to the _trash RingBuffer)
|
||||
*/
|
||||
|
||||
Glib::Mutex::Lock lm (_trash_write_mutex);
|
||||
_trash->write (&p, 1);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user