2004-03-31 17:23:26 +02:00
|
|
|
$NetBSD: patch-ae,v 1.2 2004/03/31 15:23:27 mpasternak Exp $
|
2003-11-22 18:23:42 +01:00
|
|
|
|
2004-03-31 17:23:26 +02:00
|
|
|
--- pa_unix_oss/pa_unix.c.orig Mon Jun 30 11:05:50 2003
|
|
|
|
+++ pa_unix_oss/pa_unix.c
|
|
|
|
@@ -375,7 +375,11 @@ PaError PaHost_Init( void )
|
|
|
|
* and the watchdog will detect it.
|
|
|
|
*/
|
|
|
|
|
|
|
|
-#define SCHEDULER_POLICY SCHED_RR
|
|
|
|
+#ifndef _POSIX_THREAD_IS_GNU_PTH
|
|
|
|
+# define SCHEDULER_POLICY SCHED_RR
|
|
|
|
+#else
|
|
|
|
+# define SCHEDULER_POLICY 0
|
|
|
|
+#endif
|
|
|
|
#define WATCHDOG_MAX_SECONDS (3)
|
|
|
|
#define WATCHDOG_INTERVAL_USEC (1000000)
|
|
|
|
|
|
|
|
@@ -411,13 +415,16 @@ static int PaHost_CanaryProc( PaHostSoun
|
|
|
|
|
|
|
|
static PaError PaHost_WatchDogProc( PaHostSoundControl *pahsc )
|
|
|
|
{
|
|
|
|
+#ifndef _POSIX_THREAD_IS_GNU_PTH
|
|
|
|
struct sched_param schp = { 0 };
|
|
|
|
+#endif
|
|
|
|
int maxPri;
|
|
|
|
|
|
|
|
#ifdef GNUSTEP
|
|
|
|
GSRegisterCurrentThread(); /* SB20010904 */
|
|
|
|
#endif
|
|
|
|
|
|
|
|
+#ifndef _POSIX_THREAD_IS_GNU_PTH
|
|
|
|
/* Run at a priority level above audio thread so we can still run if it hangs. */
|
|
|
|
/* Rise more than 1 because of rumored off-by-one scheduler bugs. */
|
|
|
|
schp.sched_priority = pahsc->pahsc_AudioPriority + 4;
|
|
|
|
@@ -429,7 +436,7 @@ static PaError PaHost_WatchDogProc( PaHo
|
|
|
|
ERR_RPT(("PaHost_WatchDogProc: cannot set watch dog priority!\n"));
|
|
|
|
goto killAudio;
|
|
|
|
}
|
|
|
|
-
|
|
|
|
+#endif
|
|
|
|
/* Compare watchdog time with audio and canary thread times. */
|
|
|
|
/* Sleep for a while or until thread cancelled. */
|
|
|
|
while( pahsc->pahsc_WatchDogRun )
|
|
|
|
@@ -465,7 +472,8 @@ static PaError PaHost_WatchDogProc( PaHo
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
lowerAudio:
|
|
|
|
- {
|
|
|
|
+#ifndef _POSIX_THREAD_IS_GNU_PTH
|
|
|
|
+ {
|
|
|
|
struct sched_param schat = { 0 };
|
|
|
|
if( sched_setscheduler(pahsc->pahsc_AudioThreadPID, SCHED_OTHER, &schat) != 0)
|
|
|
|
{
|
|
|
|
@@ -478,7 +486,9 @@ lowerAudio:
|
|
|
|
goto cleanup;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
-
|
|
|
|
+#else
|
|
|
|
+ goto cleanup;
|
|
|
|
+#endif
|
|
|
|
killAudio:
|
|
|
|
ERR_RPT(("PaHost_WatchDogProc: killing hung audio thread!\n"));
|
|
|
|
pthread_kill( pahsc->pahsc_AudioThread, SIGKILL );
|
|
|
|
@@ -574,18 +584,19 @@ static PaError PaHost_BoostPriority( int
|
|
|
|
{
|
|
|
|
PaHostSoundControl *pahsc;
|
|
|
|
PaError result = paNoError;
|
|
|
|
+#ifndef _POSIX_THREAD_IS_GNU_PTH
|
|
|
|
struct sched_param schp = { 0 };
|
|
|
|
-
|
|
|
|
+#endif
|
|
|
|
pahsc = (PaHostSoundControl *) past->past_DeviceData;
|
|
|
|
if( pahsc == NULL ) return paInternalError;
|
|
|
|
|
|
|
|
pahsc->pahsc_AudioThreadPID = getpid();
|
|
|
|
DBUG(("PaHost_BoostPriority: audio PID = %d\n", pahsc->pahsc_AudioThreadPID ));
|
|
|
|
-
|
|
|
|
+#ifndef _POSIX_THREAD_IS_GNU_PTH
|
|
|
|
/* Choose a priority in the middle of the range. */
|
|
|
|
pahsc->pahsc_AudioPriority = (sched_get_priority_max(SCHEDULER_POLICY) -
|
|
|
|
sched_get_priority_min(SCHEDULER_POLICY)) / 2;
|
|
|
|
- schp.sched_priority = pahsc->pahsc_AudioPriority;
|
|
|
|
+ schp.sched_priority = pahsc->pahsc_AudioPriority;
|
|
|
|
|
|
|
|
if (sched_setscheduler(0, SCHEDULER_POLICY, &schp) != 0)
|
|
|
|
{
|
|
|
|
@@ -597,7 +608,10 @@ static PaError PaHost_BoostPriority( int
|
|
|
|
/* We are running at high priority so we should have a watchdog in case audio goes wild. */
|
|
|
|
result = PaHost_StartWatchDog( pahsc );
|
|
|
|
}
|
|
|
|
-
|
|
|
|
+#else
|
|
|
|
+ DBUG(("PortAudio: audio callback priority set to level %d - call ignored with GNU Pth\n", schp.sched_priority));
|
|
|
|
+ result = PaHost_StartWatchDog( pahsc );
|
|
|
|
+#endif
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|