diff options
author | Robin Gareus <robin@gareus.org> | 2015-03-11 00:25:10 +0100 |
---|---|---|
committer | Robin Gareus <robin@gareus.org> | 2015-03-11 00:25:10 +0100 |
commit | fe85575a12d8c81e8d2d08b7d91238a88c8febe7 (patch) | |
tree | cfc272d4b291673cee546f0a3468f217be46eaef /libs/ardour/session_events.cc | |
parent | 1a5a48436a2b9627d640736603341e1b21fe45d9 (diff) |
fix “no per-thread pool” abort
For some backends the process thread can change (e.g.
switch coreaudio headphone + internal speakers)
If there are existing x-thread event calls this can lead to
the following situation:
1) SessionEvent::operator new
2) audioengine process thread change
3) SessionEvent::operator delete -> crash, wrong thread
SessionEvent::operator delete can safely push the event back to
the pool for later cleanup..
Diffstat (limited to 'libs/ardour/session_events.cc')
-rw-r--r-- | libs/ardour/session_events.cc | 5 |
1 files changed, 3 insertions, 2 deletions
diff --git a/libs/ardour/session_events.cc b/libs/ardour/session_events.cc index 0208c03cb1..d41b9c5002 100644 --- a/libs/ardour/session_events.cc +++ b/libs/ardour/session_events.cc @@ -86,7 +86,7 @@ SessionEvent::operator new (size_t) void SessionEvent::operator delete (void *ptr, size_t /*size*/) { - Pool* p = pool->per_thread_pool (); + Pool* p = pool->per_thread_pool (false); SessionEvent* ev = static_cast<SessionEvent*> (ptr); DEBUG_TRACE (DEBUG::SessionEvents, string_compose ( @@ -100,9 +100,10 @@ SessionEvent::operator delete (void *ptr, size_t /*size*/) } #endif - if (p == ev->own_pool) { + if (p && p == ev->own_pool) { p->release (ptr); } else { + assert(ev->own_pool); ev->own_pool->push (ev); DEBUG_TRACE (DEBUG::SessionEvents, string_compose ("%1 was wrong thread for this pool, pushed event onto pending list, will be deleted on next alloc from %2 pool size %3 free %4 used %5 pending %6\n", pthread_name(), ev->own_pool->name(), |