52 #include "ompt-internal.h"
53 #include "ompt-specific.c"
61 #define ompt_get_callback_success 1
62 #define ompt_get_callback_failure 0
64 #define no_tool_present 0
66 #define OMPT_API_ROUTINE static
75 const char *state_name;
76 ompt_state_t state_id;
85 ompt_status_t ompt_status = ompt_status_ready;
88 ompt_state_info_t ompt_state_info[] = {
89 #define ompt_state_macro(state, code) { # state, state },
90 FOREACH_OMPT_STATE(ompt_state_macro)
91 #undef ompt_state_macro
95 ompt_callbacks_t ompt_callbacks;
103 static ompt_interface_fn_t ompt_fn_lookup(
const char *s);
110 OMPT_API_ROUTINE
int ompt_enumerate_state(
int current_state,
int *next_state,
111 const char **next_state_name)
113 const static int len =
sizeof(ompt_state_info) /
sizeof(ompt_state_info_t);
116 for (i = 0; i < len - 1; i++) {
117 if (ompt_state_info[i].state_id == current_state) {
118 *next_state = ompt_state_info[i+1].state_id;
119 *next_state_name = ompt_state_info[i+1].state_name;
133 OMPT_API_ROUTINE
int ompt_set_callback(ompt_event_t evid, ompt_callback_t cb)
137 #define ompt_event_macro(event_name, callback_type, event_id) \
139 if (ompt_event_implementation_status(event_name)) { \
140 ompt_callbacks.ompt_callback(event_name) = (callback_type) cb; \
142 return ompt_event_implementation_status(event_name);
144 FOREACH_OMPT_EVENT(ompt_event_macro)
146 #undef ompt_event_macro
148 default:
return ompt_set_result_registration_error;
153 OMPT_API_ROUTINE
int ompt_get_callback(ompt_event_t evid, ompt_callback_t *cb)
157 #define ompt_event_macro(event_name, callback_type, event_id) \
159 if (ompt_event_implementation_status(event_name)) { \
160 ompt_callback_t mycb = \
161 (ompt_callback_t) ompt_callbacks.ompt_callback(event_name); \
164 return ompt_get_callback_success; \
167 return ompt_get_callback_failure;
169 FOREACH_OMPT_EVENT(ompt_event_macro)
171 #undef ompt_event_macro
173 default:
return ompt_get_callback_failure;
185 __attribute__ (( weak ))
187 int ompt_initialize(ompt_function_lookup_t ompt_fn_lookup,
const char *version,
188 unsigned int ompt_version)
190 return no_tool_present;
193 enum tool_setting_e {
202 static int ompt_initialized = 0;
204 if (ompt_initialized)
return;
206 const char *ompt_env_var = getenv(
"OMP_TOOL");
207 tool_setting_e tool_setting = omp_tool_error;
209 if (!ompt_env_var || !strcmp(ompt_env_var,
""))
210 tool_setting = omp_tool_unset;
211 else if (!strcmp(ompt_env_var,
"disabled"))
212 tool_setting = omp_tool_disabled;
213 else if (!strcmp(ompt_env_var,
"enabled"))
214 tool_setting = omp_tool_enabled;
216 switch(tool_setting) {
217 case omp_tool_disabled:
218 ompt_status = ompt_status_disabled;
222 case omp_tool_enabled:
224 const char *runtime_version = __ompt_get_runtime_version_internal();
226 ompt_initialize(ompt_fn_lookup, runtime_version, OMPT_VERSION);
229 ompt_status = ompt_status_track_callback;
230 __ompt_init_internal();
237 "Warning: OMP_TOOL has invalid value \"%s\".\n"
238 " legal values are (NULL,\"\",\"disabled\","
239 "\"enabled\").\n", ompt_env_var);
243 ompt_initialized = 1;
249 if (ompt_status == ompt_status_track_callback) {
250 if (ompt_callbacks.ompt_callback(ompt_event_runtime_shutdown)) {
251 ompt_callbacks.ompt_callback(ompt_event_runtime_shutdown)();
255 ompt_status = ompt_status_disabled;
264 OMPT_API_ROUTINE ompt_parallel_id_t ompt_get_parallel_id(
int ancestor_level)
266 return __ompt_get_parallel_id_internal(ancestor_level);
270 OMPT_API_ROUTINE
int ompt_get_parallel_team_size(
int ancestor_level)
272 return __ompt_get_parallel_team_size_internal(ancestor_level);
276 OMPT_API_ROUTINE
void *ompt_get_parallel_function(
int ancestor_level)
278 return __ompt_get_parallel_function_internal(ancestor_level);
282 OMPT_API_ROUTINE ompt_state_t ompt_get_state(ompt_wait_id_t *ompt_wait_id)
284 ompt_state_t thread_state = __ompt_get_state_internal(ompt_wait_id);
286 if (thread_state == ompt_state_undefined) {
287 thread_state = ompt_state_work_serial;
300 OMPT_API_ROUTINE
void *ompt_get_idle_frame()
302 return __ompt_get_idle_frame_internal();
312 OMPT_API_ROUTINE ompt_thread_id_t ompt_get_thread_id(
void)
314 return __ompt_get_thread_id_internal();
317 OMPT_API_ROUTINE ompt_task_id_t ompt_get_task_id(
int depth)
319 return __ompt_get_task_id_internal(depth);
323 OMPT_API_ROUTINE ompt_frame_t *ompt_get_task_frame(
int depth)
325 return __ompt_get_task_frame_internal(depth);
329 OMPT_API_ROUTINE
void *ompt_get_task_function(
int depth)
331 return __ompt_get_task_function_internal(depth);
340 OMPT_API_ROUTINE
void omp_idle(
void)
348 OMPT_API_ROUTINE
void omp_overhead(
void)
356 OMPT_API_ROUTINE
void omp_barrier_wait(
void)
365 OMPT_API_ROUTINE
void omp_task_wait(
void)
374 OMPT_API_ROUTINE
void omp_mutex_wait(
void)
387 OMPT_API_ROUTINE
int ompt_get_ompt_version()
403 _OMP_EXTERN
void ompt_control(uint64_t command, uint64_t modifier)
405 if (ompt_status == ompt_status_track_callback &&
406 ompt_callbacks.ompt_callback(ompt_event_control)) {
407 ompt_callbacks.ompt_callback(ompt_event_control)(command, modifier);
417 static ompt_interface_fn_t ompt_fn_lookup(
const char *s)
420 #define ompt_interface_fn(fn) \
421 if (strcmp(s, #fn) == 0) return (ompt_interface_fn_t) fn;
423 FOREACH_OMPT_INQUIRY_FN(ompt_interface_fn)
425 FOREACH_OMPT_PLACEHOLDER_FN(ompt_interface_fn)
427 return (ompt_interface_fn_t) 0;