81 static intT
array [2];
90#ifndef _RWSTD_REENTRANT
100 return _RW::__rw_atomic_exchange (
x,
y,
false);
114 static volatile int failed;
121 for (
unsigned long i = 0;
i != args->
nincr_ && !failed; ++
i) {
123 for (
unsigned long j = 0; !failed; ++
j) {
134 if (intT () !=
old) {
140 intT newval = intT (
old + 1);
142 if (intT () == newval)
158 printf (
"*** line %d: error: thread %lu failed "
159 "at increment %lu after %lu iterations\n",
165 if (100UL * args->
nincr_ ==
j) {
172 printf (
"*** line %d: error thread %lu \"timed out\" after "
173 "%lu increments and %lu iterations\n",
216#ifdef _RWSTD_LONG_LONG
235#define MAX_THREADS 32
244 rw_note (0, 0, 0,
"%s test disabled", tname);
248#ifdef _RWSTD_REENTRANT
250 static const char*
const fun =
"__rw_atomic_exchange";
252 rw_info (0, 0, 0,
"__rw::%s (%s&, %2$s): %d iterations in %d threads",
260 Args::type_tag_ =
tag;
262 Args::shared_ [0] = intT (1);
263 Args::shared_ [1] = intT (1);
267 Args args [
sizeof tid /
sizeof *tid];
269 for (
unsigned long i = 0;
i != Args::nthreads_; ++
i) {
271 args [
i].threadno_ =
i;
276 0, __LINE__,
"thread_create() failed");
279 for (
unsigned long i = 0;
i != Args::nthreads_; ++
i) {
282 "thread_join() failed");
284 if (args [
i].niter_) {
287 const unsigned long incrpcnt =
288 (100U * Args::nincr_) / args [
i].niter_;
290 printf (
"thread %lu performed %lu exchanges in %lu iterations "
291 "(%lu%% increments)\n",
292 args [
i].threadno_, args [
i].nxchg_,
293 args [
i].niter_, incrpcnt);
300 intT expect = intT (1);
302 const unsigned long nincr = (Args::nthreads_ * Args::nincr_) / 2U;
304 for (
unsigned long i = 0;
i != nincr; ++
i) {
305 if (intT () == ++expect)
311 rw_assert (Args::shared_ [0] == expect, 0, __LINE__,
312 "1. %s (%s&, %2$s); %s == %s failed",
315 rw_assert (Args::shared_ [1] == expect, 0, __LINE__,
316 "2. %s (%s&, %2$s); %s == %s failed",
345#ifdef _RWSTD_LONG_LONG
358int main (
int argc,
char *argv[])
360 return rw_test (argc, argv, __FILE__,
IMPORT_C SInt32 printf(const Char *,...)
#define _RWSTD_UNUSED(arg)
#define _RWSTD_ASSERT(ignore)
void run_test(intT, thr_args_base::tag_t tag)
intT exchange(intT &x, intT y)
void * thread_routine(thr_args< intT > *args)
const char * type_name() const
_TEST_EXPORT int rw_enabled(const char *name)
_TEST_EXPORT int rw_test(int argc, char *argv[], const char *filename, const char *clause, const char *comment, int(*testfun)(int, char **), const char *optspec,...)
_TEST_EXPORT int rw_info(int, const char *, int, const char *,...)
_TEST_EXPORT int rw_fatal(int expr, const char *filename, int line, const char *fmtspec,...)
_TEST_EXPORT int rw_note(int, const char *, int, const char *,...)
_TEST_EXPORT int rw_assert(int, const char *, int, const char *,...)
_TEST_EXPORT int rw_error(int, const char *, int, const char *,...)
_TEST_EXPORT int rw_thread_create(rw_thread_t *, rw_thread_attr_t *, rw_thread_proc *, void *)
_TEST_EXPORT int rw_thread_join(rw_thread_t, void **)
static enum thr_args_base::tag_t type_tag_
static unsigned long nincr_
static intT * get_array()
static unsigned long nthreads_
static intT * get_array()