From: Phil Burk Date: Tue, 25 Oct 2016 15:33:00 +0000 (-0700) Subject: pa_linux_alsa: fix Mutex problem X-Git-Url: https://andrewgundersen.net/repos?a=commitdiff_plain;h=refs%2Fheads%2Funixmutex;p=portaudio 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 --- 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; }