1 // RUN: %libomp-cxx-compile-and-run | %sort-threads | FileCheck %s
2 // REQUIRES: ompt
3 
4 #include <iostream>
5 #include <thread>
6 #include "callback.h"
7 int condition = 0;
8 void f() {
9   OMPT_SIGNAL(condition);
10   // wait for both pthreads to arrive
11   OMPT_WAIT(condition, 2);
12   int i = 0;
13 #pragma omp parallel num_threads(2)
14   {
15     OMPT_SIGNAL(condition);
16     OMPT_WAIT(condition, 6);
17   }
18 }
19 int main() {
20   std::thread t1(f);
21   std::thread t2(f);
22   t1.join();
23   t2.join();
24 }
25 
26 // Check if libomp supports the callbacks for this test.
27 // CHECK-NOT: {{^}}0: Could not register callback 'ompt_callback_task_create'
28 // CHECK-NOT: {{^}}0: Could not register callback 'ompt_callback_task_schedule'
29 // CHECK-NOT: {{^}}0: Could not register callback 'ompt_callback_parallel_begin'
30 // CHECK-NOT: {{^}}0: Could not register callback 'ompt_callback_parallel_end'
31 // CHECK-NOT: {{^}}0: Could not register callback 'ompt_callback_implicit_task'
32 // CHECK-NOT: {{^}}0: Could not register callback 'ompt_callback_thread_begin'
33 
34 // CHECK: 0: NULL_POINTER=[[NULL:.*$]]
35 
36 // first master thread
37 // CHECK: {{^}}[[MASTER_ID_1:[0-9]+]]: ompt_event_thread_begin:
38 // CHECK-SAME: thread_type=ompt_thread_initial=1, thread_id=[[MASTER_ID_1]]
39 
40 // CHECK: {{^}}[[MASTER_ID_1]]: ompt_event_task_create: parent_task_id=0
41 // CHECK-SAME: parent_task_frame.exit=[[NULL]]
42 // CHECK-SAME: parent_task_frame.reenter=[[NULL]]
43 // CHECK-SAME: new_task_id=[[PARENT_TASK_ID_1:[0-9]+]]
44 // CHECK-SAME: codeptr_ra=[[NULL]], task_type=ompt_task_initial=1
45 // CHECK-SAME: has_dependences=no
46 
47 // CHECK: {{^}}[[MASTER_ID_1]]: ompt_event_parallel_begin:
48 // CHECK-SAME: parent_task_id=[[PARENT_TASK_ID_1]]
49 // CHECK-SAME: parent_task_frame.exit=[[NULL]]
50 // CHECK-SAME: parent_task_frame.reenter={{0x[0-f]+}}
51 // CHECK-SAME: parallel_id=[[PARALLEL_ID_1:[0-9]+]], requested_team_size=2
52 // CHECK-SAME: codeptr_ra=0x{{[0-f]+}}, invoker={{.*}}
53 
54 // CHECK: {{^}}[[MASTER_ID_1]]: ompt_event_parallel_end:
55 // CHECK-SAME: parallel_id=[[PARALLEL_ID_1]], task_id=[[PARENT_TASK_ID_1]]
56 // CHECK-SAME: invoker={{[0-9]+}}
57 
58 // CHECK: {{^}}[[MASTER_ID_1]]: ompt_event_thread_end:
59 // CHECK-SAME: thread_id=[[MASTER_ID_1]]
60 
61 // second master thread
62 // CHECK: {{^}}[[MASTER_ID_2:[0-9]+]]: ompt_event_thread_begin:
63 // CHECK-SAME: thread_type=ompt_thread_initial=1, thread_id=[[MASTER_ID_2]]
64 
65 // CHECK: {{^}}[[MASTER_ID_2]]: ompt_event_task_create: parent_task_id=0
66 // CHECK-SAME: parent_task_frame.exit=[[NULL]]
67 // CHECK-SAME: parent_task_frame.reenter=[[NULL]]
68 // CHECK-SAME: new_task_id=[[PARENT_TASK_ID_2:[0-9]+]]
69 // CHECK-SAME: codeptr_ra=[[NULL]], task_type=ompt_task_initial=1
70 // CHECK-SAME: has_dependences=no
71 
72 // CHECK: {{^}}[[MASTER_ID_2]]: ompt_event_parallel_begin:
73 // CHECK-SAME: parent_task_id=[[PARENT_TASK_ID_2]]
74 // CHECK-SAME: parent_task_frame.exit=[[NULL]]
75 // CHECK-SAME: parent_task_frame.reenter={{0x[0-f]+}}
76 // CHECK-SAME: parallel_id=[[PARALLEL_ID_2:[0-9]+]]
77 // CHECK-SAME: requested_team_size=2, codeptr_ra=0x{{[0-f]+}}
78 // CHECK-SAME: invoker={{.*}}
79 
80 // CHECK: {{^}}[[MASTER_ID_2]]: ompt_event_parallel_end:
81 // CHECK-SAME: parallel_id=[[PARALLEL_ID_2]], task_id=[[PARENT_TASK_ID_2]]
82 // CHECK-SAME: invoker={{[0-9]+}}
83 
84 // CHECK: {{^}}[[MASTER_ID_2]]: ompt_event_thread_end:
85 // CHECK-SAME: thread_id=[[MASTER_ID_2]]
86 
87 // first worker thread
88 // CHECK: {{^}}[[THREAD_ID_1:[0-9]+]]: ompt_event_thread_begin:
89 // CHECK-SAME: thread_type=ompt_thread_worker=2, thread_id=[[THREAD_ID_1]]
90 
91 // CHECK: {{^}}[[THREAD_ID_1]]: ompt_event_thread_end:
92 // CHECK-SAME: thread_id=[[THREAD_ID_1]]
93 
94 // second worker thread
95 // CHECK: {{^}}[[THREAD_ID_2:[0-9]+]]: ompt_event_thread_begin:
96 // CHECK-SAME: thread_type=ompt_thread_worker=2, thread_id=[[THREAD_ID_2]]
97 
98 // CHECK: {{^}}[[THREAD_ID_2]]: ompt_event_thread_end:
99 // CHECK-SAME: thread_id=[[THREAD_ID_2]]
100