summaryrefslogtreecommitdiffstats
path: root/src/pulsecore
diff options
context:
space:
mode:
authorDaniel Mack <zonque@gmail.com>2011-03-20 17:57:49 +0100
committerDaniel Mack <zonque@gmail.com>2011-03-21 00:32:30 +0100
commitfc339a608e0a295312a1887b6cfb78883f7c556c (patch)
tree85db8db6d2f8e428b6fdb9f6a04c91ec64d1c8c2 /src/pulsecore
parent85c5a2d7492cfa58fdbf9fcf747a2c86dc42378b (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/pulsecore')
-rw-r--r--src/pulsecore/core-util.c38
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) {