15 #include "ompt-specific.h"
29 kmp_int32 __kmpc_cancel(
ident_t *loc_ref, kmp_int32 gtid, kmp_int32 cncl_kind) {
30 kmp_info_t *this_thr = __kmp_threads[gtid];
32 KC_TRACE(10, (
"__kmpc_cancel: T#%d request %d OMP_CANCELLATION=%d\n", gtid,
33 cncl_kind, __kmp_omp_cancellation));
35 KMP_DEBUG_ASSERT(cncl_kind != cancel_noreq);
36 KMP_DEBUG_ASSERT(cncl_kind == cancel_parallel || cncl_kind == cancel_loop ||
37 cncl_kind == cancel_sections ||
38 cncl_kind == cancel_taskgroup);
39 KMP_DEBUG_ASSERT(__kmp_get_gtid() == gtid);
41 if (__kmp_omp_cancellation) {
49 kmp_team_t *this_team = this_thr->th.th_team;
50 KMP_DEBUG_ASSERT(this_team);
51 kmp_int32 old = cancel_noreq;
52 this_team->t.t_cancel_request.compare_exchange_strong(old, cncl_kind);
53 if (old == cancel_noreq || old == cncl_kind) {
56 #if OMPT_SUPPORT && OMPT_OPTIONAL
57 if (ompt_enabled.ompt_callback_cancel) {
58 ompt_data_t *task_data;
59 __ompt_get_task_info_internal(0, NULL, &task_data, NULL, NULL,
61 ompt_cancel_flag_t type = ompt_cancel_parallel;
62 if (cncl_kind == cancel_parallel)
63 type = ompt_cancel_parallel;
64 else if (cncl_kind == cancel_loop)
65 type = ompt_cancel_loop;
66 else if (cncl_kind == cancel_sections)
67 type = ompt_cancel_sections;
68 ompt_callbacks.ompt_callback(ompt_callback_cancel)(
69 task_data, type | ompt_cancel_activated,
70 OMPT_GET_RETURN_ADDRESS(0));
77 case cancel_taskgroup:
82 kmp_taskgroup_t *taskgroup;
84 task = this_thr->th.th_current_task;
85 KMP_DEBUG_ASSERT(task);
87 taskgroup = task->td_taskgroup;
89 kmp_int32 old = cancel_noreq;
90 taskgroup->cancel_request.compare_exchange_strong(old, cncl_kind);
91 if (old == cancel_noreq || old == cncl_kind) {
94 #if OMPT_SUPPORT && OMPT_OPTIONAL
95 if (ompt_enabled.ompt_callback_cancel) {
96 ompt_data_t *task_data;
97 __ompt_get_task_info_internal(0, NULL, &task_data, NULL, NULL,
99 ompt_callbacks.ompt_callback(ompt_callback_cancel)(
100 task_data, ompt_cancel_taskgroup | ompt_cancel_activated,
101 OMPT_GET_RETURN_ADDRESS(0));
120 KMP_DEBUG_ASSERT(!__kmp_omp_cancellation);
135 kmp_int32 __kmpc_cancellationpoint(
ident_t *loc_ref, kmp_int32 gtid,
136 kmp_int32 cncl_kind) {
137 kmp_info_t *this_thr = __kmp_threads[gtid];
140 (
"__kmpc_cancellationpoint: T#%d request %d OMP_CANCELLATION=%d\n",
141 gtid, cncl_kind, __kmp_omp_cancellation));
143 KMP_DEBUG_ASSERT(cncl_kind != cancel_noreq);
144 KMP_DEBUG_ASSERT(cncl_kind == cancel_parallel || cncl_kind == cancel_loop ||
145 cncl_kind == cancel_sections ||
146 cncl_kind == cancel_taskgroup);
147 KMP_DEBUG_ASSERT(__kmp_get_gtid() == gtid);
149 if (__kmp_omp_cancellation) {
151 case cancel_parallel:
153 case cancel_sections:
157 kmp_team_t *this_team = this_thr->th.th_team;
158 KMP_DEBUG_ASSERT(this_team);
159 if (this_team->t.t_cancel_request) {
160 if (cncl_kind == this_team->t.t_cancel_request) {
163 #if OMPT_SUPPORT && OMPT_OPTIONAL
164 if (ompt_enabled.ompt_callback_cancel) {
165 ompt_data_t *task_data;
166 __ompt_get_task_info_internal(0, NULL, &task_data, NULL, NULL,
168 ompt_cancel_flag_t type = ompt_cancel_parallel;
169 if (cncl_kind == cancel_parallel)
170 type = ompt_cancel_parallel;
171 else if (cncl_kind == cancel_loop)
172 type = ompt_cancel_loop;
173 else if (cncl_kind == cancel_sections)
174 type = ompt_cancel_sections;
175 ompt_callbacks.ompt_callback(ompt_callback_cancel)(
176 task_data, type | ompt_cancel_detected,
177 OMPT_GET_RETURN_ADDRESS(0));
190 case cancel_taskgroup:
194 kmp_taskdata_t *task;
195 kmp_taskgroup_t *taskgroup;
197 task = this_thr->th.th_current_task;
198 KMP_DEBUG_ASSERT(task);
200 taskgroup = task->td_taskgroup;
203 #if OMPT_SUPPORT && OMPT_OPTIONAL
204 if (ompt_enabled.ompt_callback_cancel &&
205 !!taskgroup->cancel_request) {
206 ompt_data_t *task_data;
207 __ompt_get_task_info_internal(0, NULL, &task_data, NULL, NULL,
209 ompt_callbacks.ompt_callback(ompt_callback_cancel)(
210 task_data, ompt_cancel_taskgroup | ompt_cancel_detected,
211 OMPT_GET_RETURN_ADDRESS(0));
214 return !!taskgroup->cancel_request;
227 KMP_DEBUG_ASSERT(!__kmp_omp_cancellation);
243 kmp_int32 __kmpc_cancel_barrier(
ident_t *loc, kmp_int32 gtid) {
245 kmp_info_t *this_thr = __kmp_threads[gtid];
246 kmp_team_t *this_team = this_thr->th.th_team;
248 KMP_DEBUG_ASSERT(__kmp_get_gtid() == gtid);
254 if (__kmp_omp_cancellation) {
257 switch (KMP_ATOMIC_LD_RLX(&(this_team->t.t_cancel_request))) {
258 case cancel_parallel:
263 this_team->t.t_cancel_request = cancel_noreq;
268 case cancel_sections:
273 this_team->t.t_cancel_request = cancel_noreq;
278 case cancel_taskgroup:
309 int __kmp_get_cancellation_status(
int cancel_kind) {
310 if (__kmp_omp_cancellation) {
311 kmp_info_t *this_thr = __kmp_entry_thread();
313 switch (cancel_kind) {
314 case cancel_parallel:
316 case cancel_sections: {
317 kmp_team_t *this_team = this_thr->th.th_team;
318 return this_team->t.t_cancel_request == cancel_kind;
320 case cancel_taskgroup: {
321 kmp_taskdata_t *task;
322 kmp_taskgroup_t *taskgroup;
323 task = this_thr->th.th_current_task;
324 taskgroup = task->td_taskgroup;
325 return taskgroup && taskgroup->cancel_request;
KMP_EXPORT void __kmpc_barrier(ident_t *, kmp_int32 global_tid)