1/*
2 * Copyright (c) 2016 Linux Test Project
3 *
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License as
6 * published by the Free Software Foundation; either version 2 of
7 * the License, or (at your option) any later version.
8 *
9 * This program is distributed in the hope that it would be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12 * GNU General Public License for more details.
13 *
14 */
15
16/*
17 * Test that tst_atomic_inc works as expected.
18 */
19
20#include <pthread.h>
21#include "tst_test.h"
22
23#define THREADS 64
24#define ITERATIONS 100000
25
26static int atomic;
27
28static void *worker(void *id)
29{
30	int i;
31
32	(void) id;
33	for (i = 0; i < ITERATIONS; i++)
34		tst_atomic_inc(&atomic);
35
36	return NULL;
37}
38
39static void do_test(void)
40{
41	long i;
42	pthread_t threads[THREADS];
43
44	for (i = 0; i < THREADS; i++)
45		pthread_create(threads+i, NULL, worker, (void *)i);
46
47	for (i = 0; i < THREADS; i++) {
48		tst_res(TINFO, "Joining thread %li", i);
49		pthread_join(threads[i], NULL);
50	}
51
52	if (atomic == THREADS * ITERATIONS)
53		tst_res(TPASS, "Atomic working as expected");
54	else
55		tst_res(TFAIL, "Atomic does not have expected value");
56}
57
58static struct tst_test test = {
59	.tid = "test09",
60	.test_all = do_test,
61};
62