| // This program is used to generate a core dump for testing multithreading |
| // support. |
| |
| #include <atomic> |
| #include <chrono> |
| #include <cstdint> |
| #include <thread> |
| |
| std::atomic_int start_counter{3}; |
| |
| void pseudobarrier_wait() { |
| start_counter--; |
| while (start_counter > 0); |
| } |
| |
| void fcommon(uint32_t a, uint32_t b, uint32_t c, uint32_t d, double fa, double fb, double fc, double fd, bool segv) { |
| if (segv) { |
| int *foo = nullptr; |
| *foo = 0; |
| } |
| while (1); |
| } |
| |
| void f1() { |
| volatile uint32_t a = 0x01010101; |
| volatile uint32_t b = 0x02020202; |
| volatile uint32_t c = 0x03030303; |
| volatile uint32_t d = 0x04040404; |
| volatile double fa = 2.0; |
| volatile double fb = 4.0; |
| volatile double fc = 8.0; |
| volatile double fd = 16.0; |
| |
| pseudobarrier_wait(); |
| std::this_thread::sleep_for(std::chrono::milliseconds(200)); |
| fcommon(a, b, c, d, fa, fb, fc, fd, true); |
| } |
| |
| void f2() { |
| volatile uint32_t a = 0x11111111; |
| volatile uint32_t b = 0x12121212; |
| volatile uint32_t c = 0x13131313; |
| volatile uint32_t d = 0x14141414; |
| volatile double fa = 3.0; |
| volatile double fb = 6.0; |
| volatile double fc = 9.0; |
| volatile double fd = 12.0; |
| |
| pseudobarrier_wait(); |
| fcommon(a, b, c, d, fa, fb, fc, fd, false); |
| } |
| |
| void f3() { |
| volatile uint32_t a = 0x21212121; |
| volatile uint32_t b = 0x22222222; |
| volatile uint32_t c = 0x23232323; |
| volatile uint32_t d = 0x24242424; |
| volatile double fa = 5.0; |
| volatile double fb = 10.0; |
| volatile double fc = 15.0; |
| volatile double fd = 20.0; |
| |
| pseudobarrier_wait(); |
| fcommon(a, b, c, d, fa, fb, fc, fd, false); |
| } |
| |
| int main() { |
| std::thread t1{f1}; |
| std::thread t2{f2}; |
| std::thread t3{f3}; |
| |
| t3.join(); |
| t2.join(); |
| t1.join(); |
| |
| return 0; |
| } |