X-Git-Url: https://git.lttng.org/?p=urcu.git;a=blobdiff_plain;f=tests%2Fregression%2Frcutorture.h;h=9a2f9a1f581ffc5c34e4ce0c5f2ed2a12e114b75;hp=053653faca37a0b3be9f649c3cf7728da4c61400;hb=447c9339d4f21fe5bba1aa77eccc9f94745e6447;hpb=a13ef613168a4f5f35ca820750fedf13c403ce98 diff --git a/tests/regression/rcutorture.h b/tests/regression/rcutorture.h index 053653f..9a2f9a1 100644 --- a/tests/regression/rcutorture.h +++ b/tests/regression/rcutorture.h @@ -113,13 +113,13 @@ volatile int goflag __attribute__((__aligned__(CAA_CACHE_LINE_SIZE))) #endif #ifndef mark_rcu_quiescent_state -#define mark_rcu_quiescent_state() do ; while (0) +#define mark_rcu_quiescent_state() do {} while (0) #endif /* #ifdef mark_rcu_quiescent_state */ #ifndef put_thread_offline -#define put_thread_offline() do ; while (0) -#define put_thread_online() do ; while (0) -#define put_thread_online_delay() do ; while (0) +#define put_thread_offline() do {} while (0) +#define put_thread_online() do {} while (0) +#define put_thread_online_delay() do {} while (0) #else /* #ifndef put_thread_offline */ #define put_thread_online_delay() synchronize_rcu() #endif /* #else #ifndef put_thread_offline */ @@ -368,9 +368,6 @@ void *rcu_update_stress_test(void *arg) struct rcu_stress *p; struct rcu_head rh; - rcu_register_thread(); - rcu_thread_offline(); - while (goflag == GOFLAG_INIT) (void) poll(NULL, 0, 1); while (goflag == GOFLAG_RUN) { @@ -399,7 +396,23 @@ void *rcu_update_stress_test(void *arg) strerror(errno)); abort(); } + rcu_register_thread(); call_rcu(&rh, rcu_update_stress_test_rcu); + rcu_unregister_thread(); + /* + * Our MacOS X test machine with the following + * config: + * 15.6.0 Darwin Kernel Version 15.6.0 + * root:xnu-3248.60.10~1/RELEASE_X86_64 + * appears to have issues with liburcu-signal + * signal being delivered on top of + * pthread_cond_wait. It seems to make the + * thread continue, and therefore corrupt the + * rcu_head. Work around this issue by + * unregistering the RCU read-side thread + * immediately after call_rcu (call_rcu needs + * us to be registered RCU readers). + */ ret = pthread_cond_wait(&call_rcu_test_cond, &call_rcu_test_mutex); if (ret) { @@ -419,8 +432,6 @@ void *rcu_update_stress_test(void *arg) n_updates++; } - rcu_thread_online(); - rcu_unregister_thread(); return NULL; }