#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 */
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) {
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) {
n_updates++;
}
- rcu_thread_online();
- rcu_unregister_thread();
return NULL;
}