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