]> Repos - portaudio/commitdiff
pa_linux_alsa: fix Mutex problem unixmutex
authorPhil Burk <philburk@mobileer.com>
Tue, 25 Oct 2016 15:33:00 +0000 (08:33 -0700)
committerPhil Burk <philburk@mobileer.com>
Tue, 25 Oct 2016 15:33:00 +0000 (08:33 -0700)
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

index 584cde8901d7f16630ca1e4bc864059da0edd8f3..4fb9f036e92aa35654e30f196a4c530f39953de2 100644 (file)
@@ -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;
     }