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:
Carl Hetherington 2010-04-14 23:58:20 +00:00
parent 7939dd9399
commit 84e92060fd
5 changed files with 22 additions and 6 deletions

View file

@ -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;

View file

@ -428,5 +428,12 @@ Butler::empty_pool_trash ()
}
}
void
Butler::drop_references ()
{
SessionEvent::pool->set_trash (0);
}
} // namespace ARDOUR

View file

@ -229,6 +229,7 @@ Session::destroy ()
Stateful::loading_state_version = 0;
_butler->drop_references ();
delete _butler;
delete midi_control_ui;

View file

@ -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__

View file

@ -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);
}