diff options
| author | Daniel Mack <zonque@gmail.com> | 2011-03-20 17:57:49 +0100 | 
|---|---|---|
| committer | Daniel Mack <zonque@gmail.com> | 2011-03-21 00:32:30 +0100 | 
| commit | fc339a608e0a295312a1887b6cfb78883f7c556c (patch) | |
| tree | 85db8db6d2f8e428b6fdb9f6a04c91ec64d1c8c2 /src | |
| parent | 85c5a2d7492cfa58fdbf9fcf747a2c86dc42378b (diff) | |
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
Diffstat (limited to 'src')
| -rw-r--r-- | src/pulsecore/core-util.c | 38 | 
1 files changed, 37 insertions, 1 deletions
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 <xlocale.h> +#include <mach/mach_init.h> +#include <mach/thread_act.h> +#include <mach/thread_policy.h> +#include <sys/sysctl.h>  #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) {  | 
