14 #error The support file kmp_ftn_entry.h should not be compiled by itself.
28 #include "ompt-specific.h"
43 #ifdef KMP_GOMP_COMPAT
44 #if (KMP_FTN_ENTRIES == KMP_FTN_PLAIN) || (KMP_FTN_ENTRIES == KMP_FTN_UPPER)
45 #define PASS_ARGS_BY_VALUE 1
49 #if (KMP_FTN_ENTRIES == KMP_FTN_PLAIN) || (KMP_FTN_ENTRIES == KMP_FTN_APPEND)
50 #define PASS_ARGS_BY_VALUE 1
55 #ifdef PASS_ARGS_BY_VALUE
65 #if KMP_FTN_ENTRIES == KMP_FTN_APPEND
66 #define KMP_EXPAND_NAME_IF_APPEND(name) KMP_EXPAND_NAME(name)
68 #define KMP_EXPAND_NAME_IF_APPEND(name) name
71 void FTN_STDCALL FTN_SET_STACKSIZE(
int KMP_DEREF arg) {
73 __kmps_set_stacksize(KMP_DEREF arg);
76 __kmp_aux_set_stacksize((
size_t)KMP_DEREF arg);
80 void FTN_STDCALL FTN_SET_STACKSIZE_S(
size_t KMP_DEREF arg) {
82 __kmps_set_stacksize(KMP_DEREF arg);
85 __kmp_aux_set_stacksize(KMP_DEREF arg);
89 int FTN_STDCALL FTN_GET_STACKSIZE(
void) {
91 return (
int)__kmps_get_stacksize();
93 if (!__kmp_init_serial) {
94 __kmp_serial_initialize();
96 return (
int)__kmp_stksize;
100 size_t FTN_STDCALL FTN_GET_STACKSIZE_S(
void) {
102 return __kmps_get_stacksize();
104 if (!__kmp_init_serial) {
105 __kmp_serial_initialize();
107 return __kmp_stksize;
111 void FTN_STDCALL FTN_SET_BLOCKTIME(
int KMP_DEREF arg) {
113 __kmps_set_blocktime(KMP_DEREF arg);
118 gtid = __kmp_entry_gtid();
119 tid = __kmp_tid_from_gtid(gtid);
120 thread = __kmp_thread_from_gtid(gtid);
122 __kmp_aux_set_blocktime(KMP_DEREF arg, thread, tid);
126 int FTN_STDCALL FTN_GET_BLOCKTIME(
void) {
128 return __kmps_get_blocktime();
133 gtid = __kmp_entry_gtid();
134 tid = __kmp_tid_from_gtid(gtid);
135 team = __kmp_threads[gtid]->th.th_team;
138 if (__kmp_dflt_blocktime == KMP_MAX_BLOCKTIME) {
139 KF_TRACE(10, (
"kmp_get_blocktime: T#%d(%d:%d), blocktime=%d\n", gtid,
140 team->t.t_id, tid, KMP_MAX_BLOCKTIME));
141 return KMP_MAX_BLOCKTIME;
143 #ifdef KMP_ADJUST_BLOCKTIME
144 else if (__kmp_zero_bt && !get__bt_set(team, tid)) {
145 KF_TRACE(10, (
"kmp_get_blocktime: T#%d(%d:%d), blocktime=%d\n", gtid,
146 team->t.t_id, tid, 0));
151 KF_TRACE(10, (
"kmp_get_blocktime: T#%d(%d:%d), blocktime=%d\n", gtid,
152 team->t.t_id, tid, get__blocktime(team, tid)));
153 return get__blocktime(team, tid);
158 void FTN_STDCALL FTN_SET_LIBRARY_SERIAL(
void) {
160 __kmps_set_library(library_serial);
163 __kmp_user_set_library(library_serial);
167 void FTN_STDCALL FTN_SET_LIBRARY_TURNAROUND(
void) {
169 __kmps_set_library(library_turnaround);
172 __kmp_user_set_library(library_turnaround);
176 void FTN_STDCALL FTN_SET_LIBRARY_THROUGHPUT(
void) {
178 __kmps_set_library(library_throughput);
181 __kmp_user_set_library(library_throughput);
185 void FTN_STDCALL FTN_SET_LIBRARY(
int KMP_DEREF arg) {
187 __kmps_set_library(KMP_DEREF arg);
189 enum library_type lib;
190 lib = (
enum library_type)KMP_DEREF arg;
192 __kmp_user_set_library(lib);
196 int FTN_STDCALL FTN_GET_LIBRARY(
void) {
198 return __kmps_get_library();
200 if (!__kmp_init_serial) {
201 __kmp_serial_initialize();
203 return ((
int)__kmp_library);
207 void FTN_STDCALL FTN_SET_DISP_NUM_BUFFERS(
int KMP_DEREF arg) {
213 int num_buffers = KMP_DEREF arg;
214 if (__kmp_init_serial == FALSE && num_buffers >= KMP_MIN_DISP_NUM_BUFF &&
215 num_buffers <= KMP_MAX_DISP_NUM_BUFF) {
216 __kmp_dispatch_num_buffers = num_buffers;
221 int FTN_STDCALL FTN_SET_AFFINITY(
void **mask) {
222 #if defined(KMP_STUB) || !KMP_AFFINITY_SUPPORTED
225 if (!TCR_4(__kmp_init_middle)) {
226 __kmp_middle_initialize();
228 __kmp_assign_root_init_mask();
229 return __kmp_aux_set_affinity(mask);
233 int FTN_STDCALL FTN_GET_AFFINITY(
void **mask) {
234 #if defined(KMP_STUB) || !KMP_AFFINITY_SUPPORTED
237 if (!TCR_4(__kmp_init_middle)) {
238 __kmp_middle_initialize();
240 __kmp_assign_root_init_mask();
241 return __kmp_aux_get_affinity(mask);
245 int FTN_STDCALL FTN_GET_AFFINITY_MAX_PROC(
void) {
246 #if defined(KMP_STUB) || !KMP_AFFINITY_SUPPORTED
250 if (!TCR_4(__kmp_init_middle)) {
251 __kmp_middle_initialize();
253 __kmp_assign_root_init_mask();
254 return __kmp_aux_get_affinity_max_proc();
258 void FTN_STDCALL FTN_CREATE_AFFINITY_MASK(
void **mask) {
259 #if defined(KMP_STUB) || !KMP_AFFINITY_SUPPORTED
263 kmp_affin_mask_t *mask_internals;
264 if (!TCR_4(__kmp_init_middle)) {
265 __kmp_middle_initialize();
267 __kmp_assign_root_init_mask();
268 mask_internals = __kmp_affinity_dispatch->allocate_mask();
269 KMP_CPU_ZERO(mask_internals);
270 *mask = mask_internals;
274 void FTN_STDCALL FTN_DESTROY_AFFINITY_MASK(
void **mask) {
275 #if defined(KMP_STUB) || !KMP_AFFINITY_SUPPORTED
279 kmp_affin_mask_t *mask_internals;
280 if (!TCR_4(__kmp_init_middle)) {
281 __kmp_middle_initialize();
283 __kmp_assign_root_init_mask();
284 if (__kmp_env_consistency_check) {
286 KMP_FATAL(AffinityInvalidMask,
"kmp_destroy_affinity_mask");
289 mask_internals = (kmp_affin_mask_t *)(*mask);
290 __kmp_affinity_dispatch->deallocate_mask(mask_internals);
295 int FTN_STDCALL FTN_SET_AFFINITY_MASK_PROC(
int KMP_DEREF proc,
void **mask) {
296 #if defined(KMP_STUB) || !KMP_AFFINITY_SUPPORTED
299 if (!TCR_4(__kmp_init_middle)) {
300 __kmp_middle_initialize();
302 __kmp_assign_root_init_mask();
303 return __kmp_aux_set_affinity_mask_proc(KMP_DEREF proc, mask);
307 int FTN_STDCALL FTN_UNSET_AFFINITY_MASK_PROC(
int KMP_DEREF proc,
void **mask) {
308 #if defined(KMP_STUB) || !KMP_AFFINITY_SUPPORTED
311 if (!TCR_4(__kmp_init_middle)) {
312 __kmp_middle_initialize();
314 __kmp_assign_root_init_mask();
315 return __kmp_aux_unset_affinity_mask_proc(KMP_DEREF proc, mask);
319 int FTN_STDCALL FTN_GET_AFFINITY_MASK_PROC(
int KMP_DEREF proc,
void **mask) {
320 #if defined(KMP_STUB) || !KMP_AFFINITY_SUPPORTED
323 if (!TCR_4(__kmp_init_middle)) {
324 __kmp_middle_initialize();
326 __kmp_assign_root_init_mask();
327 return __kmp_aux_get_affinity_mask_proc(KMP_DEREF proc, mask);
334 void FTN_STDCALL KMP_EXPAND_NAME(FTN_SET_NUM_THREADS)(
int KMP_DEREF arg) {
338 __kmp_set_num_threads(KMP_DEREF arg, __kmp_entry_gtid());
343 int FTN_STDCALL KMP_EXPAND_NAME(FTN_GET_NUM_THREADS)(void) {
352 int FTN_STDCALL KMP_EXPAND_NAME(FTN_GET_MAX_THREADS)(void) {
358 if (!TCR_4(__kmp_init_middle)) {
359 __kmp_middle_initialize();
361 __kmp_assign_root_init_mask();
362 gtid = __kmp_entry_gtid();
363 thread = __kmp_threads[gtid];
366 return thread->th.th_current_task->td_icvs.nproc;
370 int FTN_STDCALL FTN_CONTROL_TOOL(
int command,
int modifier,
void *arg) {
371 #if defined(KMP_STUB) || !OMPT_SUPPORT
374 OMPT_STORE_RETURN_ADDRESS(__kmp_entry_gtid());
375 if (!TCR_4(__kmp_init_middle)) {
378 kmp_info_t *this_thr = __kmp_threads[__kmp_entry_gtid()];
379 ompt_task_info_t *parent_task_info = OMPT_CUR_TASK_INFO(this_thr);
380 parent_task_info->frame.enter_frame.ptr = OMPT_GET_FRAME_ADDRESS(0);
381 int ret = __kmp_control_tool(command, modifier, arg);
382 parent_task_info->frame.enter_frame.ptr = 0;
388 omp_allocator_handle_t FTN_STDCALL
389 FTN_INIT_ALLOCATOR(omp_memspace_handle_t KMP_DEREF m,
int KMP_DEREF ntraits,
390 omp_alloctrait_t tr[]) {
394 return __kmpc_init_allocator(__kmp_entry_gtid(), KMP_DEREF m,
395 KMP_DEREF ntraits, tr);
399 void FTN_STDCALL FTN_DESTROY_ALLOCATOR(omp_allocator_handle_t al) {
401 __kmpc_destroy_allocator(__kmp_entry_gtid(), al);
404 void FTN_STDCALL FTN_SET_DEFAULT_ALLOCATOR(omp_allocator_handle_t al) {
406 __kmpc_set_default_allocator(__kmp_entry_gtid(), al);
409 omp_allocator_handle_t FTN_STDCALL FTN_GET_DEFAULT_ALLOCATOR(
void) {
413 return __kmpc_get_default_allocator(__kmp_entry_gtid());
419 static void __kmp_fortran_strncpy_truncate(
char *buffer,
size_t buf_size,
420 char const *csrc,
size_t csrc_size) {
421 size_t capped_src_size = csrc_size;
422 if (csrc_size >= buf_size) {
423 capped_src_size = buf_size - 1;
425 KMP_STRNCPY_S(buffer, buf_size, csrc, capped_src_size);
426 if (csrc_size >= buf_size) {
427 KMP_DEBUG_ASSERT(buffer[buf_size - 1] ==
'\0');
428 buffer[buf_size - 1] = csrc[buf_size - 1];
430 for (
size_t i = csrc_size; i < buf_size; ++i)
436 class ConvertedString {
441 ConvertedString(
char const *fortran_str,
size_t size) {
442 th = __kmp_get_thread();
443 buf = (
char *)__kmp_thread_malloc(th, size + 1);
444 KMP_STRNCPY_S(buf, size + 1, fortran_str, size);
447 ~ConvertedString() { __kmp_thread_free(th, buf); }
448 const char *get()
const {
return buf; }
456 void FTN_STDCALL KMP_EXPAND_NAME_IF_APPEND(FTN_SET_AFFINITY_FORMAT)(
457 char const *format,
size_t size) {
461 if (!__kmp_init_serial) {
462 __kmp_serial_initialize();
464 ConvertedString cformat(format, size);
467 __kmp_strncpy_truncate(__kmp_affinity_format, KMP_AFFINITY_FORMAT_SIZE,
468 cformat.get(), KMP_STRLEN(cformat.get()));
478 size_t FTN_STDCALL KMP_EXPAND_NAME_IF_APPEND(FTN_GET_AFFINITY_FORMAT)(
479 char *buffer,
size_t size) {
484 if (!__kmp_init_serial) {
485 __kmp_serial_initialize();
487 format_size = KMP_STRLEN(__kmp_affinity_format);
488 if (buffer && size) {
489 __kmp_fortran_strncpy_truncate(buffer, size, __kmp_affinity_format,
501 void FTN_STDCALL KMP_EXPAND_NAME_IF_APPEND(FTN_DISPLAY_AFFINITY)(
502 char const *format,
size_t size) {
507 if (!TCR_4(__kmp_init_middle)) {
508 __kmp_middle_initialize();
510 __kmp_assign_root_init_mask();
511 gtid = __kmp_get_gtid();
512 ConvertedString cformat(format, size);
513 __kmp_aux_display_affinity(gtid, cformat.get());
527 size_t FTN_STDCALL KMP_EXPAND_NAME_IF_APPEND(FTN_CAPTURE_AFFINITY)(
528 char *buffer,
char const *format,
size_t buf_size,
size_t for_size) {
529 #if defined(KMP_STUB)
534 kmp_str_buf_t capture_buf;
535 if (!TCR_4(__kmp_init_middle)) {
536 __kmp_middle_initialize();
538 __kmp_assign_root_init_mask();
539 gtid = __kmp_get_gtid();
540 __kmp_str_buf_init(&capture_buf);
541 ConvertedString cformat(format, for_size);
542 num_required = __kmp_aux_capture_affinity(gtid, cformat.get(), &capture_buf);
543 if (buffer && buf_size) {
544 __kmp_fortran_strncpy_truncate(buffer, buf_size, capture_buf.str,
547 __kmp_str_buf_free(&capture_buf);
552 int FTN_STDCALL KMP_EXPAND_NAME(FTN_GET_THREAD_NUM)(void) {
558 #if KMP_OS_DARWIN || KMP_OS_DRAGONFLY || KMP_OS_FREEBSD || KMP_OS_NETBSD || \
559 KMP_OS_HURD || KMP_OS_OPENBSD
560 gtid = __kmp_entry_gtid();
562 if (!__kmp_init_parallel ||
563 (gtid = (
int)((kmp_intptr_t)TlsGetValue(__kmp_gtid_threadprivate_key))) ==
571 #ifdef KMP_TDATA_GTID
572 if (__kmp_gtid_mode >= 3) {
573 if ((gtid = __kmp_gtid) == KMP_GTID_DNE) {
578 if (!__kmp_init_parallel ||
579 (gtid = (
int)((kmp_intptr_t)(
580 pthread_getspecific(__kmp_gtid_threadprivate_key)))) == 0) {
584 #ifdef KMP_TDATA_GTID