+// SPDX-FileCopyrightText: 2009 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+//
+// SPDX-License-Identifier: GPL-2.0-or-later
+
/*
- * test_urcu.c
- *
* Userspace RCU library - test program
- *
- * Copyright February 2009 - Mathieu Desnoyers <mathieu.desnoyers@efficios.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>
#include <sys/wait.h>
#include <unistd.h>
#include <stdio.h>
-#include <assert.h>
#include <errno.h>
+#include <urcu/assert.h>
#include <urcu/arch.h>
#include <urcu/tls-compat.h>
#include "thread-id.h"
#endif
#include <urcu.h>
-static volatile int test_go, test_stop;
-
static unsigned long wdelay;
static int *test_rcu_pointer;
#endif /* HAVE_SCHED_SETAFFINITY */
}
-/*
- * returns 0 if test should end.
- */
-static int test_duration_write(void)
-{
- return !test_stop;
-}
-
-static int test_duration_read(void)
-{
- return !test_stop;
-}
-
static DEFINE_URCU_TLS(unsigned long long, nr_writes);
static DEFINE_URCU_TLS(unsigned long long, nr_reads);
set_affinity();
rcu_register_thread();
- assert(!rcu_read_ongoing());
+ urcu_posix_assert(!rcu_read_ongoing());
- while (!test_go)
- {
- }
- cmm_smp_mb();
+ wait_until_go();
for (;;) {
rcu_read_lock();
- assert(rcu_read_ongoing());
+ urcu_posix_assert(rcu_read_ongoing());
local_ptr = rcu_dereference(test_rcu_pointer);
rcu_debug_yield_read();
if (local_ptr)
- assert(*local_ptr == 8);
+ urcu_posix_assert(*local_ptr == 8);
if (caa_unlikely(rduration))
loop_sleep(rduration);
rcu_read_unlock();
set_affinity();
- while (!test_go)
- {
- }
- cmm_smp_mb();
+ wait_until_go();
for (;;) {
new = malloc(sizeof(int));
- assert(new);
+ urcu_posix_assert(new);
*new = 8;
old = rcu_xchg_pointer(&test_rcu_pointer, new);
if (caa_unlikely(wduration))
exit(1);
}
- cmm_smp_mb();
-
- test_go = 1;
-
- sleep(duration);
-
- test_stop = 1;
+ test_for(duration);
for (i_thr = 0; i_thr < nr_readers; i_thr++) {
err = pthread_join(tid_reader[i_thr], &tret);