| 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 | |