mirror of
https://github.com/Ardour/ardour.git
synced 2025-12-07 07:14:56 +01:00
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:
parent
7939dd9399
commit
84e92060fd
5 changed files with 22 additions and 6 deletions
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue