• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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