License cleanup: add SPDX GPL-2.0 license identifier to files with no license
[linux-block.git] / tools / testing / selftests / rcutorture / formal / srcu-cbmc / tests / store_buffering / test.c
CommitLineData
b2441318 1// SPDX-License-Identifier: GPL-2.0
418b2977
LR
2#include <src/combined_source.c>
3
4int x;
5int y;
6
7int __unbuffered_tpr_x;
8int __unbuffered_tpr_y;
9
10DEFINE_SRCU(ss);
11
12void rcu_reader(void)
13{
14 int idx;
15
16#ifndef FORCE_FAILURE_3
17 idx = srcu_read_lock(&ss);
18#endif
19 might_sleep();
20
21 __unbuffered_tpr_y = READ_ONCE(y);
22#ifdef FORCE_FAILURE
23 srcu_read_unlock(&ss, idx);
24 idx = srcu_read_lock(&ss);
25#endif
26 WRITE_ONCE(x, 1);
27
28#ifndef FORCE_FAILURE_3
29 srcu_read_unlock(&ss, idx);
30#endif
31 might_sleep();
32}
33
34void *thread_update(void *arg)
35{
36 WRITE_ONCE(y, 1);
37#ifndef FORCE_FAILURE_2
38 synchronize_srcu(&ss);
39#endif
40 might_sleep();
41 __unbuffered_tpr_x = READ_ONCE(x);
42
43 return NULL;
44}
45
46void *thread_process_reader(void *arg)
47{
48 rcu_reader();
49
50 return NULL;
51}
52
53int main(int argc, char *argv[])
54{
55 pthread_t tu;
56 pthread_t tpr;
57
58 if (pthread_create(&tu, NULL, thread_update, NULL))
59 abort();
60 if (pthread_create(&tpr, NULL, thread_process_reader, NULL))
61 abort();
62 if (pthread_join(tu, NULL))
63 abort();
64 if (pthread_join(tpr, NULL))
65 abort();
66 assert(__unbuffered_tpr_y != 0 || __unbuffered_tpr_x != 0);
67
68#ifdef ASSERT_END
69 assert(0);
70#endif
71
72 return 0;
73}