summary |
shortlog |
log |
commit | commitdiff |
tree
raw |
patch |
inline | side by side (from parent 1:
a6ca497)
Register the thread once at the begining of the update routine. Put the
thread offline when doing anything that can block.
Change-Id: I345e04ee2ef0b5ba2f065b8a3029dd0e6130037b
Signed-off-by: Olivier Dion <odion@efficios.com>
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
struct rcu_head rh;
enum writer_state writer_state = WRITER_STATE_SYNC_RCU;
struct rcu_head rh;
enum writer_state writer_state = WRITER_STATE_SYNC_RCU;
+ rcu_register_thread();
+
+ /* Offline for poll. */
+ put_thread_offline();
while (goflag == GOFLAG_INIT)
(void) poll(NULL, 0, 1);
while (goflag == GOFLAG_INIT)
(void) poll(NULL, 0, 1);
while (goflag == GOFLAG_RUN) {
i = rcu_stress_idx + 1;
if (i >= RCU_STRESS_PIPE_LEN)
while (goflag == GOFLAG_RUN) {
i = rcu_stress_idx + 1;
if (i >= RCU_STRESS_PIPE_LEN)
strerror(errno));
abort();
}
strerror(errno));
abort();
}
call_rcu(&rh, rcu_update_stress_test_rcu);
call_rcu(&rh, rcu_update_stress_test_rcu);
- rcu_unregister_thread();
/*
* Our MacOS X test machine with the following
* config:
/*
* Our MacOS X test machine with the following
* config:
* us to be registered RCU readers).
*/
call_rcu_wait = true;
* us to be registered RCU readers).
*/
call_rcu_wait = true;
+ /* Offline for pthread_cond_wait. */
+ put_thread_offline();
do {
ret = pthread_cond_wait(&call_rcu_test_cond,
&call_rcu_test_mutex);
} while (call_rcu_wait);
do {
ret = pthread_cond_wait(&call_rcu_test_cond,
&call_rcu_test_mutex);
} while (call_rcu_wait);
if (ret) {
errno = ret;
diag("pthread_cond_signal: %s",
if (ret) {
errno = ret;
diag("pthread_cond_signal: %s",
{
struct urcu_gp_poll_state poll_state;
{
struct urcu_gp_poll_state poll_state;
poll_state = start_poll_synchronize_rcu();
poll_state = start_poll_synchronize_rcu();
- rcu_unregister_thread();
+
+ /* Offline for poll. */
+ put_thread_offline();
while (!poll_state_synchronize_rcu(poll_state))
(void) poll(NULL, 0, 1); /* Wait for 1ms */
while (!poll_state_synchronize_rcu(poll_state))
(void) poll(NULL, 0, 1); /* Wait for 1ms */
advance_writer_state(&writer_state);
}
advance_writer_state(&writer_state);
}
+ rcu_unregister_thread();
+