1 | // This program is used to generate a core dump for testing multithreading |
2 | // support. |
3 | |
4 | #include <atomic> |
5 | #include <chrono> |
6 | #include <cstdint> |
7 | #include <thread> |
8 | |
9 | std::atomic_int start_counter{3}; |
10 | |
11 | void pseudobarrier_wait() { |
12 | start_counter--; |
13 | while (start_counter > 0); |
14 | } |
15 | |
16 | void fcommon(uint32_t a, uint32_t b, uint32_t c, uint32_t d, double fa, double fb, double fc, double fd, bool segv) { |
17 | if (segv) { |
18 | int *foo = nullptr; |
19 | *foo = 0; |
20 | } |
21 | while (1); |
22 | } |
23 | |
24 | void f1() { |
25 | volatile uint32_t a = 0x01010101; |
26 | volatile uint32_t b = 0x02020202; |
27 | volatile uint32_t c = 0x03030303; |
28 | volatile uint32_t d = 0x04040404; |
29 | volatile double fa = 2.0; |
30 | volatile double fb = 4.0; |
31 | volatile double fc = 8.0; |
32 | volatile double fd = 16.0; |
33 | |
34 | pseudobarrier_wait(); |
35 | std::this_thread::sleep_for(rtime: std::chrono::milliseconds(200)); |
36 | fcommon(a, b, c, d, fa, fb, fc, fd, segv: true); |
37 | } |
38 | |
39 | void f2() { |
40 | volatile uint32_t a = 0x11111111; |
41 | volatile uint32_t b = 0x12121212; |
42 | volatile uint32_t c = 0x13131313; |
43 | volatile uint32_t d = 0x14141414; |
44 | volatile double fa = 3.0; |
45 | volatile double fb = 6.0; |
46 | volatile double fc = 9.0; |
47 | volatile double fd = 12.0; |
48 | |
49 | pseudobarrier_wait(); |
50 | fcommon(a, b, c, d, fa, fb, fc, fd, segv: false); |
51 | } |
52 | |
53 | void f3() { |
54 | volatile uint32_t a = 0x21212121; |
55 | volatile uint32_t b = 0x22222222; |
56 | volatile uint32_t c = 0x23232323; |
57 | volatile uint32_t d = 0x24242424; |
58 | volatile double fa = 5.0; |
59 | volatile double fb = 10.0; |
60 | volatile double fc = 15.0; |
61 | volatile double fd = 20.0; |
62 | |
63 | pseudobarrier_wait(); |
64 | fcommon(a, b, c, d, fa, fb, fc, fd, segv: false); |
65 | } |
66 | |
67 | int main() { |
68 | std::thread t1{f1}; |
69 | std::thread t2{f2}; |
70 | std::thread t3{f3}; |
71 | |
72 | t3.join(); |
73 | t2.join(); |
74 | t1.join(); |
75 | |
76 | return 0; |
77 | } |
78 | |