-/*
- * test_urcu_wfs.c
- *
+// SPDX-FileCopyrightText: 2010 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+// SPDX-FileCopyrightText: 2010 Paolo Bonzini <pbonzini@redhat.com>
+//
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+ /*
* Userspace RCU library - example RCU-based lock-free stack
- *
- * Copyright February 2010 - Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
- * Copyright February 2010 - Paolo Bonzini <pbonzini@redhat.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
#include <stdio.h>
static int test_force_sync;
-static volatile int test_go, test_stop_enqueue, test_stop_dequeue;
+static volatile int test_stop_enqueue, test_stop_dequeue;
static unsigned long rduration;
*/
static int test_duration_dequeue(void)
{
- return !test_stop_dequeue;
+ return !uatomic_load(&test_stop_dequeue, CMM_RELAXED);
}
static int test_duration_enqueue(void)
{
- return !test_stop_enqueue;
+ return !uatomic_load(&test_stop_enqueue, CMM_RELAXED);
}
static DEFINE_URCU_TLS(unsigned long long, nr_dequeues);
set_affinity();
- while (!test_go)
- {
- }
- cmm_smp_mb();
+ wait_until_go();
for (;;) {
struct cds_wfs_node *node = malloc(sizeof(*node));
set_affinity();
- while (!test_go)
- {
- }
- cmm_smp_mb();
+ wait_until_go();
urcu_posix_assert(test_pop || test_pop_all);
cmm_smp_mb();
- test_go = 1;
+ begin_test();
for (i_thr = 0; i_thr < duration; i_thr++) {
sleep(1);
}
}
- test_stop_enqueue = 1;
+ uatomic_store(&test_stop_enqueue, 1, CMM_RELEASE);
if (test_wait_empty) {
while (nr_enqueuers != uatomic_read(&test_enqueue_stopped)) {
}
}
- test_stop_dequeue = 1;
+ uatomic_store(&test_stop_dequeue, 1, CMM_RELAXED);
for (i_thr = 0; i_thr < nr_enqueuers; i_thr++) {
err = pthread_join(tid_enqueuer[i_thr], &tret);