dd83558bd690b6f9801b6d2a9f91bfc69e03d2cd
[openbsd] /
1 //===-- main.cpp ------------------------------------------------*- C++ -*-===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8
9 // This test verifies the correct handling of child thread exits.
10
11 #include "pseudo_barrier.h"
12 #include <thread>
13 #include <csignal>
14
15 pseudo_barrier_t g_barrier1;
16 pseudo_barrier_t g_barrier2;
17
18 void *
19 thread1 ()
20 {
21   // Synchronize with the main thread.
22   pseudo_barrier_wait(g_barrier1);
23
24   // Synchronize with the main thread and thread2.
25   pseudo_barrier_wait(g_barrier2);
26
27   // Return
28   return NULL; // Should not reach here. (thread2 should raise SIGILL)
29 }
30
31 void *
32 thread2 ()
33 {
34   raise(SIGILL); // Raise SIGILL
35
36   // Synchronize with thread1 and the main thread.
37   pseudo_barrier_wait(g_barrier2); // Should not reach here.
38
39   // Return
40   return NULL;
41 }
42
43 int main ()
44 {
45   pseudo_barrier_init(g_barrier1, 2);
46   pseudo_barrier_init(g_barrier2, 3);
47
48   // Create a thread.
49   std::thread thread_1(thread1);
50
51   // Wait for thread1 to start.
52   pseudo_barrier_wait(g_barrier1);
53
54   // Create another thread.
55   std::thread thread_2(thread2);
56
57   // Wait for thread2 to start.
58   // Second thread should crash but first thread and main thread may reach here.
59   pseudo_barrier_wait(g_barrier2);
60
61   return 0;
62 }