$NetBSD: patch-ae,v 1.2 2004/03/31 15:23:27 mpasternak Exp $ --- 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; }