From fc339a608e0a295312a1887b6cfb78883f7c556c Mon Sep 17 00:00:00 2001 From: Daniel Mack Date: Sun, 20 Mar 2011 17:57:49 +0100 Subject: osx: add routines for real-time thread scheduling Code sniplets are based on examples provided by Apple. See http://developer.apple.com/library/mac/#documentation/Darwin/Conceptual/KernelProgramming/scheduler/scheduler.html --- src/pulsecore/core-util.c | 38 +++++++++++++++++++++++++++++++++++++- 1 file changed, 37 insertions(+), 1 deletion(-) (limited to 'src/pulsecore') diff --git a/src/pulsecore/core-util.c b/src/pulsecore/core-util.c index a713cae0..7d239186 100644 --- a/src/pulsecore/core-util.c +++ b/src/pulsecore/core-util.c @@ -107,6 +107,10 @@ #ifdef __APPLE__ #include +#include +#include +#include +#include #endif #ifdef HAVE_DBUS @@ -685,7 +689,39 @@ static int set_scheduler(int rtprio) { * the thread is already realtime, don't do anything. */ int pa_make_realtime(int rtprio) { -#ifdef _POSIX_PRIORITY_SCHEDULING +#if defined(OS_IS_DARWIN) + struct thread_time_constraint_policy ttcpolicy; + uint64_t freq = 0; + size_t size = sizeof(freq); + int ret; + + ret = sysctlbyname("hw.cpufrequency", &freq, &size, NULL, 0); + if (ret < 0) { + pa_log_info("Unable to read CPU frequency, acquisition of real-time scheduling failed."); + return -1; + } + + pa_log_debug("sysctl for hw.cpufrequency: %llu", freq); + + /* See http://developer.apple.com/library/mac/#documentation/Darwin/Conceptual/KernelProgramming/scheduler/scheduler.html */ + ttcpolicy.period = freq / 160; + ttcpolicy.computation = freq / 3300; + ttcpolicy.constraint = freq / 2200; + ttcpolicy.preemptible = 1; + + ret = thread_policy_set(mach_thread_self(), + THREAD_TIME_CONSTRAINT_POLICY, + (thread_policy_t) &ttcpolicy, + THREAD_TIME_CONSTRAINT_POLICY_COUNT); + if (ret) { + pa_log_info("Unable to set real-time thread priority (%08x).", ret); + return -1; + } + + pa_log_info("Successfully acquired real-time thread priority."); + return 0; + +#elif _POSIX_PRIORITY_SCHEDULING int p; if (set_scheduler(rtprio) >= 0) { -- cgit