summaryrefslogtreecommitdiff
path: root/libs/ardour/session_events.cc
diff options
context:
space:
mode:
authorRobin Gareus <robin@gareus.org>2015-03-11 00:25:10 +0100
committerRobin Gareus <robin@gareus.org>2015-03-11 00:25:10 +0100
commitfe85575a12d8c81e8d2d08b7d91238a88c8febe7 (patch)
treecfc272d4b291673cee546f0a3468f217be46eaef /libs/ardour/session_events.cc
parent1a5a48436a2b9627d640736603341e1b21fe45d9 (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.cc5
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(),