changeset 27443:06e3c6bac36d v8.2.4250

patch 8.2.4250: channel out callback test is flaky on Mac Commit: https://github.com/vim/vim/commit/24714a191659b89c26bd7acd5934590d1c5c51d2 Author: ichizok <gclient.gaap@gmail.com> Date: Sat Jan 29 12:10:43 2022 +0000 patch 8.2.4250: channel out callback test is flaky on Mac Problem: Channel out callback test is flaky on Mac. Solution: Assign high priority to the test process. (Ozaki Kiichi, closes #9653)
author Bram Moolenaar <Bram@vim.org>
date Sat, 29 Jan 2022 13:15:03 +0100
parents b967aa552f64
children 75ad30234ddd
files src/testdir/test_channel_pipe.py src/testdir/thread_util.py src/version.c
diffstat 3 files changed, 100 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/src/testdir/test_channel_pipe.py
+++ b/src/testdir/test_channel_pipe.py
@@ -5,6 +5,7 @@
 # This requires Python 2.6 or later.
 
 from __future__ import print_function
+import os
 import sys
 import time
 
@@ -27,6 +28,13 @@ if __name__ == "__main__":
             if sys.argv[1].startswith("quit"):
                 sys.exit(0)
 
+    if os.getenv('CI'):
+        try:
+            import thread_util
+            thread_util.set_high_priority()
+        except Exception:
+            pass
+
     while True:
         typed = sys.stdin.readline()
         if typed == "":  # EOF -- stop
new file mode 100644
--- /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)
--- a/src/version.c
+++ b/src/version.c
@@ -751,6 +751,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    4250,
+/**/
     4249,
 /**/
     4248,