From 34d51e1bc9c650c4d012fe3024f7777c819ba969 Mon Sep 17 00:00:00 2001 From: Azat Khuzhin Date: Tue, 14 Jan 2020 00:27:21 +0300 Subject: [PATCH] test: fix compilation under win32 (rearrange thread_setup() code) --- test/regress.h | 1 - test/regress_main.c | 52 +++++-------------------------------------- test/regress_thread.c | 45 +++++++++++++++++++++++++++++++++++++ test/regress_thread.h | 7 +++++- 4 files changed, 56 insertions(+), 49 deletions(-) diff --git a/test/regress.h b/test/regress.h index 07a48339..55a2fddb 100644 --- a/test/regress.h +++ b/test/regress.h @@ -141,7 +141,6 @@ SSL_CTX *get_ssl_ctx(void); void init_ssl(void); #endif -void thread_setup(pthread_t pthread); void * basic_test_setup(const struct testcase_t *testcase); int basic_test_cleanup(const struct testcase_t *testcase, void *ptr); diff --git a/test/regress_main.c b/test/regress_main.c index 31641d68..ce5c38cc 100644 --- a/test/regress_main.c +++ b/test/regress_main.c @@ -81,10 +81,12 @@ #include "event2/event-config.h" #include "regress.h" +#include "regress_thread.h" #include "tinytest.h" #include "tinytest_macros.h" #include "../iocp-internal.h" #include "../event-internal.h" +#include "../evthread-internal.h" struct evutil_weakrand_state test_weakrand_state; @@ -186,52 +188,6 @@ ignore_log_cb(int s, const char *msg) { } -#if defined(__APPLE__) - -#ifdef EVENT__HAVE_MACH_MACH_H -#include -#endif -#ifdef EVENT__HAVE_MACH_MACH_TIME_H -#include -#endif -#include - -/** - * 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 - */ -void move_pthread_to_realtime_scheduling_class(pthread_t pthread) -{ - mach_timebase_info_data_t timebase_info; - mach_timebase_info(&timebase_info); - - const uint64_t NANOS_PER_MSEC = 1000000ULL; - double clock2abs = ((double)timebase_info.denom / (double)timebase_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_self()), - 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(pthread_t pthread) -{ - move_pthread_to_realtime_scheduling_class(pthread); -} -#else -void thread_setup(pthread_t pthread) {} -#endif - void * basic_test_setup(const struct testcase_t *testcase) { @@ -245,7 +201,9 @@ basic_test_setup(const struct testcase_t *testcase) evthread_flags |= EVTHREAD_PTHREAD_PRIO_INHERIT; #endif - thread_setup(pthread_self()); +#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 3f46764d..312f985c 100644 --- a/test/regress_thread.c +++ b/test/regress_thread.c @@ -66,6 +66,51 @@ #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_self()), + 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 ca79bc5c..21a62a4d 100644 --- a/test/regress_thread.h +++ b/test/regress_thread.h @@ -34,6 +34,7 @@ #define THREAD_T pthread_t #define THREAD_FN void * #define THREAD_RETURN() return (NULL) +#define THREAD_SELF() pthread_self() #define THREAD_START(threadvar, fn, arg) do { \ if (!pthread_create(&(threadvar), NULL, fn, arg)) \ thread_setup(threadvar); \ @@ -43,11 +44,15 @@ #define THREAD_T HANDLE #define THREAD_FN unsigned __stdcall #define THREAD_RETURN() return (0) -#define THREAD_START(threadvar, fn, arg) do { \ +#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 +void thread_setup(THREAD_T pthread); + #endif -- 2.40.0