diff --git a/test/regress_main.c b/test/regress_main.c index 9a95d365..26656121 100644 --- a/test/regress_main.c +++ b/test/regress_main.c @@ -33,6 +33,14 @@ #include #endif +/* move_pthread_to_realtime_scheduling_class() */ +#ifdef EVENT__HAVE_MACH_MACH_H +#include +#endif +#ifdef EVENT__HAVE_MACH_MACH_TIME_H +#include +#endif + #if defined(__APPLE__) && defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) #if (__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ >= 1060 && \ __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ < 1070) @@ -188,6 +196,45 @@ ignore_log_cb(int s, const char *msg) { } +/** + * Put into the real time scheduling class for better timers latency. + * https://developer.apple.com/library/archive/technotes/tn2169/_index.html#//apple_ref/doc/uid/DTS40013172-CH1-TNTAG6000 + */ +#if defined(__APPLE__) +static void move_pthread_to_realtime_scheduling_class(pthread_t pthread) +{ + mach_timebase_info_data_t info; + mach_timebase_info(&info); + + const uint64_t NANOS_PER_MSEC = 1000000ULL; + double clock2abs = + ((double)info.denom / (double)info.numer) * NANOS_PER_MSEC; + + thread_time_constraint_policy_data_t policy; + policy.period = 0; + policy.computation = (uint32_t)(5 * clock2abs); // 5 ms of work + policy.constraint = (uint32_t)(10 * clock2abs); + policy.preemptible = FALSE; + + int kr = thread_policy_set(pthread_mach_thread_np(pthread), + THREAD_TIME_CONSTRAINT_POLICY, + (thread_policy_t)&policy, + THREAD_TIME_CONSTRAINT_POLICY_COUNT); + if (kr != KERN_SUCCESS) { + mach_error("thread_policy_set:", kr); + exit(1); + } +} + +void thread_setup(THREAD_T pthread) +{ + move_pthread_to_realtime_scheduling_class(pthread); +} +#else /** \__APPLE__ */ +void thread_setup(THREAD_T pthread) {} +#endif /** \!__APPLE__ */ + + void * basic_test_setup(const struct testcase_t *testcase) { @@ -195,9 +242,7 @@ basic_test_setup(const struct testcase_t *testcase) evutil_socket_t spair[2] = { -1, -1 }; struct basic_test_data *data = NULL; -#ifndef EVENT__DISABLE_THREAD_SUPPORT thread_setup(THREAD_SELF()); -#endif #ifndef _WIN32 if (testcase->flags & TT_ENABLE_IOCP_FLAG) diff --git a/test/regress_thread.c b/test/regress_thread.c index 69f59ed1..1e0ce41f 100644 --- a/test/regress_thread.c +++ b/test/regress_thread.c @@ -66,51 +66,6 @@ #include "time-internal.h" #include "regress_thread.h" -/** - * Put into the real time scheduling class for better timers latency. - * https://developer.apple.com/library/archive/technotes/tn2169/_index.html#//apple_ref/doc/uid/DTS40013172-CH1-TNTAG6000 - */ -#if defined(__APPLE__) -#ifdef EVENT__HAVE_MACH_MACH_H -#include -#endif -#ifdef EVENT__HAVE_MACH_MACH_TIME_H -#include -#endif -static void move_pthread_to_realtime_scheduling_class(pthread_t pthread) -{ - mach_timebase_info_data_t info; - mach_timebase_info(&info); - - const uint64_t NANOS_PER_MSEC = 1000000ULL; - double clock2abs = - ((double)info.denom / (double)info.numer) * NANOS_PER_MSEC; - - thread_time_constraint_policy_data_t policy; - policy.period = 0; - policy.computation = (uint32_t)(5 * clock2abs); // 5 ms of work - policy.constraint = (uint32_t)(10 * clock2abs); - policy.preemptible = FALSE; - - int kr = thread_policy_set(pthread_mach_thread_np(pthread), - THREAD_TIME_CONSTRAINT_POLICY, - (thread_policy_t)&policy, - THREAD_TIME_CONSTRAINT_POLICY_COUNT); - if (kr != KERN_SUCCESS) { - mach_error("thread_policy_set:", kr); - exit(1); - } -} - -void thread_setup(THREAD_T pthread) -{ - move_pthread_to_realtime_scheduling_class(pthread); -} -#else /** \__APPLE__ */ -void thread_setup(THREAD_T pthread) {} -#endif /** \!__APPLE__ */ - - struct cond_wait { void *lock; void *cond; diff --git a/test/regress_thread.h b/test/regress_thread.h index ef8943e3..a954fefa 100644 --- a/test/regress_thread.h +++ b/test/regress_thread.h @@ -27,9 +27,18 @@ #ifndef REGRESS_THREAD_H_INCLUDED_ #define REGRESS_THREAD_H_INCLUDED_ -#include "regress.h" - -#ifdef EVENT__HAVE_PTHREADS /** PTHREADS */ +#if defined(_WIN32) /** _WIN32 */ +#define THREAD_T void * /* HANDLE */ +#define THREAD_FN unsigned __stdcall +#define THREAD_RETURN() return (0) +#define THREAD_SELF() GetCurrentThreadId() +#define THREAD_START(threadvar, fn, arg) do { \ + uintptr_t threadhandle = _beginthreadex(NULL,0,fn,(arg),0,NULL); \ + (threadvar) = (THREAD_T)threadhandle; \ + thread_setup(threadvar); \ +} while (0) +#define THREAD_JOIN(th) WaitForSingleObject(th, INFINITE) +#else /* !_WIN32 */ #include #define THREAD_T pthread_t #define THREAD_FN void * @@ -40,21 +49,8 @@ thread_setup(threadvar); \ } while (0) #define THREAD_JOIN(th) pthread_join(th, NULL) -#elif defined(_WIN32) /** _WIN32 */ -#define THREAD_T HANDLE -#define THREAD_FN unsigned __stdcall -#define THREAD_RETURN() return (0) -#define THREAD_SELF() GetCurrentThreadId() -#define THREAD_START(threadvar, fn, arg) do { \ - uintptr_t threadhandle = _beginthreadex(NULL,0,fn,(arg),0,NULL); \ - (threadvar) = (HANDLE) threadhandle; \ - thread_setup(threadvar); \ -} while (0) -#define THREAD_JOIN(th) WaitForSingleObject(th, INFINITE) #endif /* \!_WIN32 */ -#ifndef EVENT__DISABLE_THREAD_SUPPORT void thread_setup(THREAD_T pthread); -#endif #endif