Add a couple of pthread helper macros
authorJohn Emmas <johne53@tiscali.co.uk>
Tue, 6 May 2014 08:31:11 +0000 (09:31 +0100)
committerJohn Emmas <johne53@tiscali.co.uk>
Tue, 6 May 2014 08:31:11 +0000 (09:31 +0100)
(to accommodate the fact that in ptw-win32, 'pthread_t' is subtlely different from its non-Windows counterparts)

libs/backends/wavesaudio/wavesapi/devicemanager/WCMRNativeAudio.cpp
libs/backends/wavesaudio/wavesapi/miscutils/pthread_utils.h [new file with mode: 0644]
libs/pbd/MSVCpbd/pbd.vcproj
libs/pbd/pbd/pthread_utils.h

index 14cb1dd1247dcaa850d744981e75028dd98831da..642ea22de1f55b6304d4fbe51e8494184557063f 100644 (file)
@@ -12,6 +12,7 @@
 #endif
 
 #include "WCMRNativeAudio.h"
+#include "MiscUtils/pthread_utils.h"
 #include "MiscUtils/safe_delete.h"
 #include <sstream>
 #include <boost/assign/list_of.hpp>
 //**********************************************************************************************
 WCMRNativeAudioNoneDevice::WCMRNativeAudioNoneDevice (WCMRAudioDeviceManager *pManager)
        : WCMRNativeAudioDevice (pManager, false /*useMultiThreading*/)
-       , m_SilenceThread(0)
 #if defined (PLATFORM_WINDOWS)
     , _waitableTimerForUsleep (CreateWaitableTimer(NULL, TRUE, NULL))
 #endif
 {
+       mark_pthread_inactive (m_SilenceThread);
+
        m_DeviceName = NONE_DEVICE_NAME;
 
        m_SamplingRates = boost::assign::list_of (m_CurrentSamplingRate=44100)(48000)(88200)(96000);
@@ -136,7 +138,7 @@ WTErr WCMRNativeAudioNoneDevice::SetStreaming (bool newState)
 
        if (Streaming())
        {
-               if (m_SilenceThread)
+               if (is_pthread_active (m_SilenceThread))
                        std::cerr << "\t\t\t\t\t !!!!!!!!!!!!!!! Warning: the inactive NONE-DEVICE was streaming!" << std::endl;
 
                pthread_attr_t attributes;
@@ -155,19 +157,19 @@ WTErr WCMRNativeAudioNoneDevice::SetStreaming (bool newState)
                }
 
                if (pthread_create (&m_SilenceThread, &attributes, __SilenceThread, this)) {
-                       m_SilenceThread = 0;
+                       mark_pthread_inactive (m_SilenceThread);
                        std::cerr << "WCMRNativeAudioNoneDevice::SetStreaming (): pthread_create () failed!" << std::endl;
                        return eGenericErr;
                }
        }
        else
        {
-               if (!m_SilenceThread)
+               if (!is_pthread_active (m_SilenceThread))
                {
                        std::cerr << "\t\t\t\t\t !!!!!!!!!!!!!!! Warning: the active NONE-DEVICE was NOT streaming!" << std::endl;
                }
 
-               while (m_SilenceThread)
+               while (is_pthread_active (m_SilenceThread))
                {
                        _usleep(1); //now wait for ended  thread;
                }
@@ -219,7 +221,7 @@ void WCMRNativeAudioNoneDevice::_SilenceThread()
         }
                audioCallbackData.acdCycleStartTimeNanos = cycleEndTimeNanos+1;
     }
-       m_SilenceThread = 0;
+       mark_pthread_inactive (m_SilenceThread);
 }
 
 void* WCMRNativeAudioNoneDevice::__SilenceThread(void *This)
diff --git a/libs/backends/wavesaudio/wavesapi/miscutils/pthread_utils.h b/libs/backends/wavesaudio/wavesapi/miscutils/pthread_utils.h
new file mode 100644 (file)
index 0000000..825405d
--- /dev/null
@@ -0,0 +1,38 @@
+/*
+    Copyright (C) 2014 John Emmas 
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program; if not, write to the Free Software
+    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+*/
+
+#ifndef __waves_pthread_utils__
+#define __waves_pthread_utils__
+
+/* Accommodate thread setting (and testing) for both
+ * 'libpthread' and 'libpthread_win32' (whose implementations
+ * of 'pthread_t' are subtlely different)
+ */
+#ifndef PTHREAD_MACROS_DEFINED
+#define PTHREAD_MACROS_DEFINED
+#ifdef  PTW32_VERSION  /* pthread_win32 */
+#define mark_pthread_inactive(threadID)  threadID.p=0
+#define is_pthread_active(threadID)      threadID.p==0
+#else                 /* normal pthread */
+#define mark_pthread_inactive(threadID)  threadID=0
+#define is_pthread_active(threadID)      threadID==0
+#endif  /* PTW32_VERSION */
+
+#endif  /* PTHREAD_MACROS_DEFINED */
+#endif  /* __waves_pthread_utils__ */
index 62da682c3837f29e327756af93ef12e6d86a4a07..6c57c84239b62efcbbf288ec2225c26bc76ffc0f 100644 (file)
                                RelativePath="..\pbd\property_basics.h"
                                >
                        </File>
+                       <File
+                               RelativePath="..\pbd\pthread_utils.h"
+                               >
+                       </File>
                        <File
                                RelativePath="..\pbd\rcu.h"
                                >
index 37ce72371514a5c6312d6feb79c8ededd609e408..ee78819d59d968a47070d7dcb4c3de6528233068 100644 (file)
 #ifndef __pbd_pthread_utils__
 #define __pbd_pthread_utils__
 
+/* Accommodate thread setting (and testing) for both
+ * 'libpthread' and 'libpthread_win32' (whose implementations
+ * of 'pthread_t' are subtlely different)
+ */
+#ifndef PTHREAD_MACROS_DEFINED
+#define PTHREAD_MACROS_DEFINED
+#ifdef  PTW32_VERSION  /* pthread_win32 */
+#define mark_pthread_inactive(threadID)  threadID.p=0
+#define is_pthread_active(threadID)      threadID.p==0
+#else                 /* normal pthread */
+#define mark_pthread_inactive(threadID)  threadID=0
+#define is_pthread_active(threadID)      threadID==0
+#endif  /* PTW32_VERSION */
+#endif  /* PTHREAD_MACROS_DEFINED */
+
 #ifdef COMPILER_MSVC
 #include <ardourext/pthread.h>
 #else