From b3077642aa904eeb4e9a915459ea5dc380a28fda Mon Sep 17 00:00:00 2001 From: Phil Burk Date: Tue, 25 Oct 2016 08:33:00 -0700 Subject: [PATCH] pa_linux_alsa: fix Mutex problem This patch was written by Chris Brannon. https://lists.columbia.edu/pipermail/portaudio/2016-October/000902.html A discussion of the problem is here: https://lists.columbia.edu/pipermail/portaudio/2016-October/000895.html It is related to a patch for ticket #251 --- src/hostapi/alsa/pa_linux_alsa.c | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/src/hostapi/alsa/pa_linux_alsa.c b/src/hostapi/alsa/pa_linux_alsa.c index 584cde8..4fb9f03 100644 --- a/src/hostapi/alsa/pa_linux_alsa.c +++ b/src/hostapi/alsa/pa_linux_alsa.c @@ -3236,14 +3236,20 @@ static PaError AlsaRestart( PaAlsaStream *stream ) { PaError result = paNoError; - PA_ENSURE( PaUnixMutex_Lock( &stream->stateMtx ) ); + /* If in callback mode, the only thread calling this function + * should be the callback thread, in which case there's no need + * to lock the mutex. */ + if( !stream->callbackMode ) + PA_ENSURE( PaUnixMutex_Lock( &stream->stateMtx ) ); + PA_ENSURE( AlsaStop( stream, 0 ) ); PA_ENSURE( AlsaStart( stream, 0 ) ); PA_DEBUG(( "%s: Restarted audio\n", __FUNCTION__ )); error: - PA_ENSURE( PaUnixMutex_Unlock( &stream->stateMtx ) ); + if( !stream->callbackMode ) + PA_ENSURE( PaUnixMutex_Unlock( &stream->stateMtx ) ); return result; } @@ -4224,9 +4230,18 @@ static void *CallbackThreadFunc( void *userData ) else { PA_ENSURE( PaUnixThread_PrepareNotify( &stream->thread ) ); +#ifdef PTHREAD_CANCELED + /* Need to re-disable cancelability because of PaUnixMutex_* calls. */ + pthread_testcancel(); + pthread_setcancelstate( PTHREAD_CANCEL_DISABLE, NULL ); +#endif /* Buffer will be zeroed */ PA_ENSURE( AlsaStart( stream, 0 ) ); PA_ENSURE( PaUnixThread_NotifyParent( &stream->thread ) ); +#ifdef PTHREAD_CANCELED + pthread_testcancel(); + pthread_setcancelstate( PTHREAD_CANCEL_DISABLE, NULL ); +#endif streamStarted = 1; } -- 2.43.0