summaryrefslogtreecommitdiffstats
path: root/src/testdir/thread_util.py
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/testdir/thread_util.py90
1 files changed, 90 insertions, 0 deletions
diff --git a/src/testdir/thread_util.py b/src/testdir/thread_util.py
new file mode 100644
index 0000000..e82f23c
--- /dev/null
+++ b/src/testdir/thread_util.py
@@ -0,0 +1,90 @@
+import platform
+
+if platform.system() == 'Darwin':
+ from ctypes import (
+ CDLL,
+ POINTER,
+ Structure,
+ byref,
+ c_int,
+ c_uint,
+ c_uint32,
+ c_void_p,
+ sizeof
+ )
+ from ctypes.util import find_library
+
+ class ThreadTimeConstraintPolicy(Structure):
+ _fields_ = [
+ ("period", c_uint32),
+ ("computation", c_uint32),
+ ("constraint", c_uint32),
+ ("preemptible", c_uint)
+ ]
+
+ _libc = CDLL(find_library('c'))
+
+ THREAD_TIME_CONSTRAINT_POLICY = c_uint(2)
+
+ THREAD_TIME_CONSTRAINT_POLICY_COUNT = c_uint(
+ int(sizeof(ThreadTimeConstraintPolicy) / sizeof(c_int)))
+
+ _libc.pthread_self.restype = c_void_p
+
+ _libc.pthread_mach_thread_np.restype = c_uint
+ _libc.pthread_mach_thread_np.argtypes = [c_void_p]
+
+ _libc.thread_policy_get.restype = c_int
+ _libc.thread_policy_get.argtypes = [
+ c_uint,
+ c_uint,
+ c_void_p,
+ POINTER(c_uint),
+ POINTER(c_uint)
+ ]
+
+ _libc.thread_policy_set.restype = c_int
+ _libc.thread_policy_set.argtypes = [
+ c_uint,
+ c_uint,
+ c_void_p,
+ c_uint
+ ]
+
+ def _mach_thread_self():
+ return _libc.pthread_mach_thread_np(_libc.pthread_self())
+
+ def _get_time_constraint_policy(default=False):
+ thread = _mach_thread_self()
+ policy_info = ThreadTimeConstraintPolicy()
+ policy_infoCnt = THREAD_TIME_CONSTRAINT_POLICY_COUNT
+ get_default = c_uint(default)
+
+ kret = _libc.thread_policy_get(
+ thread,
+ THREAD_TIME_CONSTRAINT_POLICY,
+ byref(policy_info),
+ byref(policy_infoCnt),
+ byref(get_default))
+ if kret != 0:
+ return None
+ return policy_info
+
+ def _set_time_constraint_policy(policy_info):
+ thread = _mach_thread_self()
+ policy_infoCnt = THREAD_TIME_CONSTRAINT_POLICY_COUNT
+
+ kret = _libc.thread_policy_set(
+ thread,
+ THREAD_TIME_CONSTRAINT_POLICY,
+ byref(policy_info),
+ policy_infoCnt)
+ if kret != 0:
+ raise OSError(kret)
+
+ def set_high_priority():
+ policy_info = _get_time_constraint_policy(default=True)
+ if not policy_info:
+ return
+ policy_info.preemptible = c_uint(False)
+ _set_time_constraint_policy(policy_info)