// This program is used to generate a core dump for testing multithreading // support. #include #include #include #include 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; }