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
26 static int atomic;
27
worker(void * id)28 static 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
do_test(void)39 static 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
58 static struct tst_test test = {
59 .test_all = do_test,
60 };
61