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(std::chrono::milliseconds(200)); 36 fcommon(a, b, c, d, fa, fb, fc, fd, 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, 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, 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