pthread_cond_wait(3) can have spurious wakeups. Fix this by polling a
state associated with the the wait.
Change-Id: Iba034cba5f72ad88388d1b90a6093f4ae9f9beb9
Signed-off-by: Olivier Dion <odion@efficios.com>
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
static pthread_mutex_t call_rcu_test_mutex = PTHREAD_MUTEX_INITIALIZER;
static pthread_cond_t call_rcu_test_cond = PTHREAD_COND_INITIALIZER;
static pthread_mutex_t call_rcu_test_mutex = PTHREAD_MUTEX_INITIALIZER;
static pthread_cond_t call_rcu_test_cond = PTHREAD_COND_INITIALIZER;
+static bool call_rcu_wait;
static
void rcu_update_stress_test_rcu(struct rcu_head *head __attribute__((unused)))
static
void rcu_update_stress_test_rcu(struct rcu_head *head __attribute__((unused)))
strerror(errno));
abort();
}
strerror(errno));
abort();
}
ret = pthread_mutex_unlock(&call_rcu_test_mutex);
if (ret) {
errno = ret;
ret = pthread_mutex_unlock(&call_rcu_test_mutex);
if (ret) {
errno = ret;
* immediately after call_rcu (call_rcu needs
* us to be registered RCU readers).
*/
* 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);
+ call_rcu_wait = true;
+ 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",