15 #include "ompt-specific.h"
31 kmp_int32 __kmpc_cancel(
ident_t *loc_ref, kmp_int32 gtid, kmp_int32 cncl_kind) {
32 kmp_info_t *this_thr = __kmp_threads[gtid];
34 KC_TRACE(10, (
"__kmpc_cancel: T#%d request %d OMP_CANCELLATION=%d\n", gtid,
35 cncl_kind, __kmp_omp_cancellation));
37 KMP_DEBUG_ASSERT(cncl_kind != cancel_noreq);
38 KMP_DEBUG_ASSERT(cncl_kind == cancel_parallel || cncl_kind == cancel_loop ||
39 cncl_kind == cancel_sections ||
40 cncl_kind == cancel_taskgroup);
41 KMP_DEBUG_ASSERT(__kmp_get_gtid() == gtid);
43 if (__kmp_omp_cancellation) {
51 kmp_team_t *this_team = this_thr->th.th_team;
52 KMP_DEBUG_ASSERT(this_team);
53 kmp_int32 old = cancel_noreq;
54 this_team->t.t_cancel_request.compare_exchange_strong(old, cncl_kind);
55 if (old == cancel_noreq || old == cncl_kind) {
58 #if OMPT_SUPPORT && OMPT_OPTIONAL
59 if (ompt_enabled.ompt_callback_cancel) {
60 ompt_data_t *task_data;
61 __ompt_get_task_info_internal(0, NULL, &task_data, NULL, NULL,
63 ompt_cancel_flag_t type = ompt_cancel_parallel;
64 if (cncl_kind == cancel_parallel)
65 type = ompt_cancel_parallel;
66 else if (cncl_kind == cancel_loop)
67 type = ompt_cancel_loop;
68 else if (cncl_kind == cancel_sections)
69 type = ompt_cancel_sections;
70 ompt_callbacks.ompt_callback(ompt_callback_cancel)(
71 task_data, type | ompt_cancel_activated,
72 OMPT_GET_RETURN_ADDRESS(0));
79 case cancel_taskgroup:
84 kmp_taskgroup_t *taskgroup;
86 task = this_thr->th.th_current_task;
87 KMP_DEBUG_ASSERT(task);
89 taskgroup = task->td_taskgroup;
91 kmp_int32 old = cancel_noreq;
92 taskgroup->cancel_request.compare_exchange_strong(old, cncl_kind);
93 if (old == cancel_noreq || old == cncl_kind) {
96 #if OMPT_SUPPORT && OMPT_OPTIONAL
97 if (ompt_enabled.ompt_callback_cancel) {
98 ompt_data_t *task_data;
99 __ompt_get_task_info_internal(0, NULL, &task_data, NULL, NULL,
101 ompt_callbacks.ompt_callback(ompt_callback_cancel)(
102 task_data, ompt_cancel_taskgroup | ompt_cancel_activated,
103 OMPT_GET_RETURN_ADDRESS(0));
122 KMP_DEBUG_ASSERT(!__kmp_omp_cancellation);
137 kmp_int32 __kmpc_cancellationpoint(
ident_t *loc_ref, kmp_int32 gtid,
138 kmp_int32 cncl_kind) {
139 kmp_info_t *this_thr = __kmp_threads[gtid];
142 (
"__kmpc_cancellationpoint: T#%d request %d OMP_CANCELLATION=%d\n",
143 gtid, cncl_kind, __kmp_omp_cancellation));
145 KMP_DEBUG_ASSERT(cncl_kind != cancel_noreq);
146 KMP_DEBUG_ASSERT(cncl_kind == cancel_parallel || cncl_kind == cancel_loop ||
147 cncl_kind == cancel_sections ||
148 cncl_kind == cancel_taskgroup);
149 KMP_DEBUG_ASSERT(__kmp_get_gtid() == gtid);
151 if (__kmp_omp_cancellation) {
153 case cancel_parallel:
155 case cancel_sections:
159 kmp_team_t *this_team = this_thr->th.th_team;
160 KMP_DEBUG_ASSERT(this_team);
161 if (this_team->t.t_cancel_request) {
162 if (cncl_kind == this_team->t.t_cancel_request) {
165 #if OMPT_SUPPORT && OMPT_OPTIONAL
166 if (ompt_enabled.ompt_callback_cancel) {
167 ompt_data_t *task_data;
168 __ompt_get_task_info_internal(0, NULL, &task_data, NULL, NULL,
170 ompt_cancel_flag_t type = ompt_cancel_parallel;
171 if (cncl_kind == cancel_parallel)
172 type = ompt_cancel_parallel;
173 else if (cncl_kind == cancel_loop)
174 type = ompt_cancel_loop;
175 else if (cncl_kind == cancel_sections)
176 type = ompt_cancel_sections;
177 ompt_callbacks.ompt_callback(ompt_callback_cancel)(
178 task_data, type | ompt_cancel_detected,
179 OMPT_GET_RETURN_ADDRESS(0));
192 case cancel_taskgroup:
196 kmp_taskdata_t *task;
197 kmp_taskgroup_t *taskgroup;
199 task = this_thr->th.th_current_task;
200 KMP_DEBUG_ASSERT(task);
202 taskgroup = task->td_taskgroup;
205 #if OMPT_SUPPORT && OMPT_OPTIONAL
206 if (ompt_enabled.ompt_callback_cancel &&
207 !!taskgroup->cancel_request) {
208 ompt_data_t *task_data;
209 __ompt_get_task_info_internal(0, NULL, &task_data, NULL, NULL,
211 ompt_callbacks.ompt_callback(ompt_callback_cancel)(
212 task_data, ompt_cancel_taskgroup | ompt_cancel_detected,
213 OMPT_GET_RETURN_ADDRESS(0));
216 return !!taskgroup->cancel_request;
229 KMP_DEBUG_ASSERT(!__kmp_omp_cancellation);
245 kmp_int32 __kmpc_cancel_barrier(
ident_t *loc, kmp_int32 gtid) {
247 kmp_info_t *this_thr = __kmp_threads[gtid];
248 kmp_team_t *this_team = this_thr->th.th_team;
250 KMP_DEBUG_ASSERT(__kmp_get_gtid() == gtid);
256 if (__kmp_omp_cancellation) {
259 switch (KMP_ATOMIC_LD_RLX(&(this_team->t.t_cancel_request))) {
260 case cancel_parallel:
265 this_team->t.t_cancel_request = cancel_noreq;
270 case cancel_sections:
275 this_team->t.t_cancel_request = cancel_noreq;
280 case cancel_taskgroup:
311 int __kmp_get_cancellation_status(
int cancel_kind) {
312 if (__kmp_omp_cancellation) {
313 kmp_info_t *this_thr = __kmp_entry_thread();
315 switch (cancel_kind) {
316 case cancel_parallel:
318 case cancel_sections: {
319 kmp_team_t *this_team = this_thr->th.th_team;
320 return this_team->t.t_cancel_request == cancel_kind;
322 case cancel_taskgroup: {
323 kmp_taskdata_t *task;
324 kmp_taskgroup_t *taskgroup;
325 task = this_thr->th.th_current_task;
326 taskgroup = task->td_taskgroup;
327 return taskgroup && taskgroup->cancel_request;
KMP_EXPORT void __kmpc_barrier(ident_t *, kmp_int32 global_tid)