xref: /petsc/src/sys/perfstubs/pstimer.c (revision 6f933394ea0da1dbc01e2ca6853fb6eed18e5571)
1a0c7f9aaSSamuel Khuvis // Copyright (c) 2019 University of Oregon
2a0c7f9aaSSamuel Khuvis // Distributed under the BSD Software License
3a0c7f9aaSSamuel Khuvis // (See accompanying file LICENSE.txt)
4a0c7f9aaSSamuel Khuvis 
5a0c7f9aaSSamuel Khuvis #ifndef _GNU_SOURCE
6a0c7f9aaSSamuel Khuvis #define _GNU_SOURCE // needed to define RTLD_DEFAULT
7a0c7f9aaSSamuel Khuvis #endif
8a0c7f9aaSSamuel Khuvis #include <stdlib.h>
9a0c7f9aaSSamuel Khuvis #include <stdio.h>
10a0c7f9aaSSamuel Khuvis #include <math.h>
118525bd49SMark Adams #ifndef PERFSTUBS_STANDALONE
128525bd49SMark Adams #include "petscconf.h"
138525bd49SMark Adams #ifdef PETSC_HAVE_DLFCN_H
148525bd49SMark Adams #define PERFSTUBS_HAVE_DLFCN_H
158525bd49SMark Adams #endif
168525bd49SMark Adams #endif
178525bd49SMark Adams #if defined(__linux__) && defined(PERFSTUBS_HAVE_DLFCN_H)
18a0c7f9aaSSamuel Khuvis #include <dlfcn.h>
19a0c7f9aaSSamuel Khuvis #else
20a0c7f9aaSSamuel Khuvis #define PERFSTUBS_USE_STATIC 1
21a0c7f9aaSSamuel Khuvis #endif
22a0c7f9aaSSamuel Khuvis #define PERFSTUBS_USE_TIMERS
23a0c7f9aaSSamuel Khuvis #include "timer.h"
24a0c7f9aaSSamuel Khuvis 
25a0c7f9aaSSamuel Khuvis #define MAX_TOOLS 1
26a0c7f9aaSSamuel Khuvis 
27a0c7f9aaSSamuel Khuvis #if defined(_WIN32)||defined(WIN32)||defined(_WIN64)||defined(WIN64)||defined(__CYGWIN__)||defined(__APPLE__)
28a0c7f9aaSSamuel Khuvis #define PERFSTUBS_OFF
29a0c7f9aaSSamuel Khuvis #endif
30a0c7f9aaSSamuel Khuvis 
31a0c7f9aaSSamuel Khuvis /* Make sure that the Timer singleton is constructed when the
32a0c7f9aaSSamuel Khuvis  * library is loaded.  This will ensure (on linux, anyway) that
33a0c7f9aaSSamuel Khuvis  * we can assert that we have m_Initialized on the main thread. */
34a0c7f9aaSSamuel Khuvis //static void __attribute__((constructor)) initialize_library(void);
35a0c7f9aaSSamuel Khuvis 
36a0c7f9aaSSamuel Khuvis /* Globals for the plugin API */
37a0c7f9aaSSamuel Khuvis 
38a0c7f9aaSSamuel Khuvis int perfstubs_initialized = PERFSTUBS_UNKNOWN;
39a0c7f9aaSSamuel Khuvis int num_tools_registered = 0;
40a0c7f9aaSSamuel Khuvis /* Keep track of whether the thread has been registered */
41a0c7f9aaSSamuel Khuvis #ifndef PERFSTUBS_OFF
42a0c7f9aaSSamuel Khuvis __thread int thread_seen = 0;
43a0c7f9aaSSamuel Khuvis #endif
44a0c7f9aaSSamuel Khuvis /* Function pointers */
45a0c7f9aaSSamuel Khuvis 
46a0c7f9aaSSamuel Khuvis ps_initialize_t initialize_functions[MAX_TOOLS];
47a0c7f9aaSSamuel Khuvis ps_register_thread_t register_thread_functions[MAX_TOOLS];
48a0c7f9aaSSamuel Khuvis ps_finalize_t finalize_functions[MAX_TOOLS];
49a0c7f9aaSSamuel Khuvis ps_dump_data_t dump_data_functions[MAX_TOOLS];
50a0c7f9aaSSamuel Khuvis ps_timer_create_t timer_create_functions[MAX_TOOLS];
51a0c7f9aaSSamuel Khuvis ps_timer_start_t timer_start_functions[MAX_TOOLS];
52a0c7f9aaSSamuel Khuvis ps_timer_stop_t timer_stop_functions[MAX_TOOLS];
53a0c7f9aaSSamuel Khuvis ps_set_parameter_t set_parameter_functions[MAX_TOOLS];
54a0c7f9aaSSamuel Khuvis ps_dynamic_phase_start_t dynamic_phase_start_functions[MAX_TOOLS];
55a0c7f9aaSSamuel Khuvis ps_dynamic_phase_stop_t dynamic_phase_stop_functions[MAX_TOOLS];
56a0c7f9aaSSamuel Khuvis ps_create_counter_t create_counter_functions[MAX_TOOLS];
57a0c7f9aaSSamuel Khuvis ps_sample_counter_t sample_counter_functions[MAX_TOOLS];
58a0c7f9aaSSamuel Khuvis ps_set_metadata_t set_metadata_functions[MAX_TOOLS];
59a0c7f9aaSSamuel Khuvis ps_get_timer_data_t get_timer_data_functions[MAX_TOOLS];
60a0c7f9aaSSamuel Khuvis ps_get_counter_data_t get_counter_data_functions[MAX_TOOLS];
61a0c7f9aaSSamuel Khuvis ps_get_metadata_t get_metadata_functions[MAX_TOOLS];
62a0c7f9aaSSamuel Khuvis ps_free_timer_data_t free_timer_data_functions[MAX_TOOLS];
63a0c7f9aaSSamuel Khuvis ps_free_counter_data_t free_counter_data_functions[MAX_TOOLS];
64a0c7f9aaSSamuel Khuvis ps_free_metadata_t free_metadata_functions[MAX_TOOLS];
65a0c7f9aaSSamuel Khuvis 
66a0c7f9aaSSamuel Khuvis #ifndef PERFSTUBS_OFF
67a0c7f9aaSSamuel Khuvis 
68a0c7f9aaSSamuel Khuvis #ifdef PERFSTUBS_USE_STATIC
69a0c7f9aaSSamuel Khuvis 
70a0c7f9aaSSamuel Khuvis #if defined(__clang__) && defined(__APPLE__)
71a0c7f9aaSSamuel Khuvis #define PS_WEAK_PRE
72a0c7f9aaSSamuel Khuvis #define PS_WEAK_POST __attribute__((weak_import))
73a0c7f9aaSSamuel Khuvis #define PS_WEAK_POST_NULL __attribute__((weak_import))
74a0c7f9aaSSamuel Khuvis #else
75a0c7f9aaSSamuel Khuvis #define PS_WEAK_PRE __attribute__((weak))
76a0c7f9aaSSamuel Khuvis #define PS_WEAK_POST
77a0c7f9aaSSamuel Khuvis #define PS_WEAK_POST_NULL
78a0c7f9aaSSamuel Khuvis #endif
79a0c7f9aaSSamuel Khuvis 
80a0c7f9aaSSamuel Khuvis PS_WEAK_PRE void ps_tool_initialize(void) PS_WEAK_POST;
81a0c7f9aaSSamuel Khuvis PS_WEAK_PRE void ps_tool_register_thread(void) PS_WEAK_POST;
82a0c7f9aaSSamuel Khuvis PS_WEAK_PRE void ps_tool_finalize(void) PS_WEAK_POST;
83a0c7f9aaSSamuel Khuvis PS_WEAK_PRE void ps_tool_dump_data(void) PS_WEAK_POST;
84a0c7f9aaSSamuel Khuvis PS_WEAK_PRE void* ps_tool_timer_create(const char *) PS_WEAK_POST;
85a0c7f9aaSSamuel Khuvis PS_WEAK_PRE void ps_tool_timer_start(const void *) PS_WEAK_POST;
86a0c7f9aaSSamuel Khuvis PS_WEAK_PRE void ps_tool_timer_stop(const void *) PS_WEAK_POST;
87a0c7f9aaSSamuel Khuvis PS_WEAK_PRE void ps_tool_set_parameter(const char *, int64_t) PS_WEAK_POST;
88a0c7f9aaSSamuel Khuvis PS_WEAK_PRE void ps_tool_dynamic_phase_start(const char *, int) PS_WEAK_POST;
89a0c7f9aaSSamuel Khuvis PS_WEAK_PRE void ps_tool_dynamic_phase_stop(const char *, int) PS_WEAK_POST;
90a0c7f9aaSSamuel Khuvis PS_WEAK_PRE void* ps_tool_create_counter(const char *) PS_WEAK_POST;
91a0c7f9aaSSamuel Khuvis PS_WEAK_PRE void ps_tool_sample_counter(const void *, double) PS_WEAK_POST;
92a0c7f9aaSSamuel Khuvis PS_WEAK_PRE void ps_tool_set_metadata(const char *, const char *) PS_WEAK_POST;
93a0c7f9aaSSamuel Khuvis PS_WEAK_PRE void ps_tool_get_timer_data(ps_tool_timer_data_t *) PS_WEAK_POST;
94a0c7f9aaSSamuel Khuvis PS_WEAK_PRE void ps_tool_get_counter_data(ps_tool_counter_data_t *) PS_WEAK_POST;
95a0c7f9aaSSamuel Khuvis PS_WEAK_PRE void ps_tool_get_metadata(ps_tool_metadata_t *) PS_WEAK_POST;
96a0c7f9aaSSamuel Khuvis PS_WEAK_PRE void ps_tool_free_timer_data(ps_tool_timer_data_t *) PS_WEAK_POST;
97a0c7f9aaSSamuel Khuvis PS_WEAK_PRE void ps_tool_free_counter_data(ps_tool_counter_data_t *) PS_WEAK_POST;
98a0c7f9aaSSamuel Khuvis PS_WEAK_PRE void ps_tool_free_metadata(ps_tool_metadata_t *) PS_WEAK_POST;
99a0c7f9aaSSamuel Khuvis #endif
100a0c7f9aaSSamuel Khuvis 
101a0c7f9aaSSamuel Khuvis 
102a0c7f9aaSSamuel Khuvis // Disable pedantic, see https://stackoverflow.com/a/36385690
103a0c7f9aaSSamuel Khuvis #pragma GCC diagnostic push  // Save actual diagnostics state
104a0c7f9aaSSamuel Khuvis #pragma GCC diagnostic ignored "-Wpedantic" // Disable pedantic
105a0c7f9aaSSamuel Khuvis 
106a0c7f9aaSSamuel Khuvis #endif //PERFSTUBS_OFF
107a0c7f9aaSSamuel Khuvis 
1081b6dcdd2SPierre Jolivet void initialize_library(void) {
109a0c7f9aaSSamuel Khuvis #ifndef PERFSTUBS_OFF
110a0c7f9aaSSamuel Khuvis #ifdef PERFSTUBS_USE_STATIC
111a0c7f9aaSSamuel Khuvis     /* The initialization function is the only required one */
112a0c7f9aaSSamuel Khuvis     initialize_functions[0] = &ps_tool_initialize;
113a0c7f9aaSSamuel Khuvis     if (initialize_functions[0] == NULL) {
114a0c7f9aaSSamuel Khuvis         return;
115a0c7f9aaSSamuel Khuvis     }
116a0c7f9aaSSamuel Khuvis     printf("Found ps_tool_initialize(), registering tool\n");
117a0c7f9aaSSamuel Khuvis     register_thread_functions[0] = &ps_tool_register_thread;
118a0c7f9aaSSamuel Khuvis     finalize_functions[0] = &ps_tool_finalize;
119a0c7f9aaSSamuel Khuvis     dump_data_functions[0] = &ps_tool_dump_data;
120a0c7f9aaSSamuel Khuvis     timer_create_functions[0] = &ps_tool_timer_create;
121a0c7f9aaSSamuel Khuvis     timer_start_functions[0] = &ps_tool_timer_start;
122a0c7f9aaSSamuel Khuvis     timer_stop_functions[0] = &ps_tool_timer_stop;
123a0c7f9aaSSamuel Khuvis     set_parameter_functions[0] = &ps_tool_set_parameter;
124a0c7f9aaSSamuel Khuvis     dynamic_phase_start_functions[0] = &ps_tool_dynamic_phase_start;
125a0c7f9aaSSamuel Khuvis     dynamic_phase_stop_functions[0] = &ps_tool_dynamic_phase_stop;
126a0c7f9aaSSamuel Khuvis     create_counter_functions[0] = &ps_tool_create_counter;
127a0c7f9aaSSamuel Khuvis     sample_counter_functions[0] = &ps_tool_sample_counter;
128a0c7f9aaSSamuel Khuvis     set_metadata_functions[0] = &ps_tool_set_metadata;
129a0c7f9aaSSamuel Khuvis     get_timer_data_functions[0] = &ps_tool_get_timer_data;
130a0c7f9aaSSamuel Khuvis     get_counter_data_functions[0] = &ps_tool_get_counter_data;
131a0c7f9aaSSamuel Khuvis     get_metadata_functions[0] = &ps_tool_get_metadata;
132a0c7f9aaSSamuel Khuvis     free_timer_data_functions[0] = &ps_tool_free_timer_data;
133a0c7f9aaSSamuel Khuvis     free_counter_data_functions[0] = &ps_tool_free_counter_data;
134a0c7f9aaSSamuel Khuvis     free_metadata_functions[0] = &ps_tool_free_metadata;
135a0c7f9aaSSamuel Khuvis #else
136a0c7f9aaSSamuel Khuvis     initialize_functions[0] =
137a0c7f9aaSSamuel Khuvis         (ps_initialize_t)dlsym(RTLD_DEFAULT, "ps_tool_initialize");
138a0c7f9aaSSamuel Khuvis     if (initialize_functions[0] == NULL) {
139a0c7f9aaSSamuel Khuvis         perfstubs_initialized = PERFSTUBS_FAILURE;
140a0c7f9aaSSamuel Khuvis         return;
141a0c7f9aaSSamuel Khuvis     }
142a0c7f9aaSSamuel Khuvis     printf("Found ps_tool_initialize(), registering tool\n");
143a0c7f9aaSSamuel Khuvis     finalize_functions[0] =
144a0c7f9aaSSamuel Khuvis         (ps_finalize_t)dlsym(RTLD_DEFAULT, "ps_tool_finalize");
145a0c7f9aaSSamuel Khuvis     register_thread_functions[0] =
146a0c7f9aaSSamuel Khuvis         (ps_register_thread_t)dlsym(RTLD_DEFAULT, "ps_tool_register_thread");
147a0c7f9aaSSamuel Khuvis     dump_data_functions[0] =
148a0c7f9aaSSamuel Khuvis         (ps_dump_data_t)dlsym(RTLD_DEFAULT, "ps_tool_dump_data");
149a0c7f9aaSSamuel Khuvis     timer_create_functions[0] =
150a0c7f9aaSSamuel Khuvis         (ps_timer_create_t)dlsym(RTLD_DEFAULT,
151a0c7f9aaSSamuel Khuvis         "ps_tool_timer_create");
152a0c7f9aaSSamuel Khuvis     timer_start_functions[0] =
153a0c7f9aaSSamuel Khuvis         (ps_timer_start_t)dlsym(RTLD_DEFAULT, "ps_tool_timer_start");
154a0c7f9aaSSamuel Khuvis     timer_stop_functions[0] =
155a0c7f9aaSSamuel Khuvis         (ps_timer_stop_t)dlsym(RTLD_DEFAULT, "ps_tool_timer_stop");
156a0c7f9aaSSamuel Khuvis     set_parameter_functions[0] =
157a0c7f9aaSSamuel Khuvis         (ps_set_parameter_t)dlsym(RTLD_DEFAULT, "ps_tool_set_parameter");
158a0c7f9aaSSamuel Khuvis     dynamic_phase_start_functions[0] = (ps_dynamic_phase_start_t)dlsym(
159a0c7f9aaSSamuel Khuvis         RTLD_DEFAULT, "ps_tool_dynamic_phase_start");
160a0c7f9aaSSamuel Khuvis     dynamic_phase_stop_functions[0] = (ps_dynamic_phase_stop_t)dlsym(
161a0c7f9aaSSamuel Khuvis         RTLD_DEFAULT, "ps_tool_dynamic_phase_stop");
162a0c7f9aaSSamuel Khuvis     create_counter_functions[0] = (ps_create_counter_t)dlsym(
163a0c7f9aaSSamuel Khuvis         RTLD_DEFAULT, "ps_tool_create_counter");
164a0c7f9aaSSamuel Khuvis     sample_counter_functions[0] = (ps_sample_counter_t)dlsym(
165a0c7f9aaSSamuel Khuvis         RTLD_DEFAULT, "ps_tool_sample_counter");
166a0c7f9aaSSamuel Khuvis     set_metadata_functions[0] =
167a0c7f9aaSSamuel Khuvis         (ps_set_metadata_t)dlsym(RTLD_DEFAULT, "ps_tool_set_metadata");
168a0c7f9aaSSamuel Khuvis     get_timer_data_functions[0] = (ps_get_timer_data_t)dlsym(
169a0c7f9aaSSamuel Khuvis         RTLD_DEFAULT, "ps_tool_get_timer_data");
170a0c7f9aaSSamuel Khuvis     get_counter_data_functions[0] = (ps_get_counter_data_t)dlsym(
171a0c7f9aaSSamuel Khuvis         RTLD_DEFAULT, "ps_tool_get_counter_data");
172a0c7f9aaSSamuel Khuvis     get_metadata_functions[0] = (ps_get_metadata_t)dlsym(
173a0c7f9aaSSamuel Khuvis         RTLD_DEFAULT, "ps_tool_get_metadata");
174a0c7f9aaSSamuel Khuvis     free_timer_data_functions[0] = (ps_free_timer_data_t)dlsym(
175a0c7f9aaSSamuel Khuvis         RTLD_DEFAULT, "ps_tool_free_timer_data");
176a0c7f9aaSSamuel Khuvis     free_counter_data_functions[0] = (ps_free_counter_data_t)dlsym(
177a0c7f9aaSSamuel Khuvis         RTLD_DEFAULT, "ps_tool_free_counter_data");
178a0c7f9aaSSamuel Khuvis     free_metadata_functions[0] = (ps_free_metadata_t)dlsym(
179a0c7f9aaSSamuel Khuvis         RTLD_DEFAULT, "ps_tool_free_metadata");
180a0c7f9aaSSamuel Khuvis #endif
181a0c7f9aaSSamuel Khuvis     perfstubs_initialized = PERFSTUBS_SUCCESS;
182a0c7f9aaSSamuel Khuvis     /* Increment the number of tools */
183a0c7f9aaSSamuel Khuvis     num_tools_registered = 1;
184a0c7f9aaSSamuel Khuvis #endif //PERFSTUBS_OFF
185a0c7f9aaSSamuel Khuvis }
186a0c7f9aaSSamuel Khuvis #ifndef PERFSTUBS_OFF
187a0c7f9aaSSamuel Khuvis #pragma GCC diagnostic pop  // Restore diagnostics state
188a0c7f9aaSSamuel Khuvis #endif
189a0c7f9aaSSamuel Khuvis 
190a0c7f9aaSSamuel Khuvis char * ps_make_timer_name_(const char * file,
191a0c7f9aaSSamuel Khuvis     const char * func, int line) {
192a0c7f9aaSSamuel Khuvis     #ifndef PERFSTUBS_OFF
193a0c7f9aaSSamuel Khuvis     /* The length of the line number as a string is floor(log10(abs(num))) */
194a0c7f9aaSSamuel Khuvis     int string_length = (strlen(file) + strlen(func) + floor(log10(abs(line))) + 11);
195a0c7f9aaSSamuel Khuvis     char * name = (char*)calloc(string_length, sizeof(char));
196a0c7f9aaSSamuel Khuvis     sprintf(name, "%s [{%s} {%d,0}]", func, file, line);
197a0c7f9aaSSamuel Khuvis     return (name);
198a0c7f9aaSSamuel Khuvis     #else
199a0c7f9aaSSamuel Khuvis     return NULL;
200a0c7f9aaSSamuel Khuvis     #endif
201a0c7f9aaSSamuel Khuvis }
202a0c7f9aaSSamuel Khuvis 
203a0c7f9aaSSamuel Khuvis // used internally to the class
204a0c7f9aaSSamuel Khuvis void ps_register_thread_internal(void) {
205a0c7f9aaSSamuel Khuvis #ifndef PERFSTUBS_OFF
206a0c7f9aaSSamuel Khuvis     	int i;
207a0c7f9aaSSamuel Khuvis     for (i = 0 ; i < num_tools_registered ; i++) {
208a0c7f9aaSSamuel Khuvis         register_thread_functions[i]();
209a0c7f9aaSSamuel Khuvis     }
210a0c7f9aaSSamuel Khuvis     thread_seen = 1;
211a0c7f9aaSSamuel Khuvis #endif
212a0c7f9aaSSamuel Khuvis }
213a0c7f9aaSSamuel Khuvis 
214a0c7f9aaSSamuel Khuvis /* Initialization */
215a0c7f9aaSSamuel Khuvis void ps_initialize_(void) {
216a0c7f9aaSSamuel Khuvis #ifndef PERFSTUBS_OFF
217a0c7f9aaSSamuel Khuvis     int i;
218a0c7f9aaSSamuel Khuvis     initialize_library();
219a0c7f9aaSSamuel Khuvis     for (i = 0 ; i < num_tools_registered ; i++) {
220a0c7f9aaSSamuel Khuvis         initialize_functions[i]();
221a0c7f9aaSSamuel Khuvis     }
222a0c7f9aaSSamuel Khuvis     /* No need to register the main thread */
223a0c7f9aaSSamuel Khuvis     thread_seen = 1;
224a0c7f9aaSSamuel Khuvis #endif
225a0c7f9aaSSamuel Khuvis }
226a0c7f9aaSSamuel Khuvis 
227a0c7f9aaSSamuel Khuvis void ps_finalize_(void) {
228a0c7f9aaSSamuel Khuvis     #ifndef PERFSTUBS_OFF
229a0c7f9aaSSamuel Khuvis     int i;
230a0c7f9aaSSamuel Khuvis     for (i = 0 ; i < num_tools_registered ; i++) {
231a0c7f9aaSSamuel Khuvis         finalize_functions[i]();
232a0c7f9aaSSamuel Khuvis     }
233a0c7f9aaSSamuel Khuvis     #endif
234a0c7f9aaSSamuel Khuvis }
235a0c7f9aaSSamuel Khuvis 
236a0c7f9aaSSamuel Khuvis void ps_register_thread_(void) {
237a0c7f9aaSSamuel Khuvis #ifndef PERFSTUBS_OFF
238a0c7f9aaSSamuel Khuvis     if (thread_seen == 0) {
239a0c7f9aaSSamuel Khuvis         ps_register_thread_internal();
240a0c7f9aaSSamuel Khuvis     }
241a0c7f9aaSSamuel Khuvis #endif
242a0c7f9aaSSamuel Khuvis }
243a0c7f9aaSSamuel Khuvis 
244a0c7f9aaSSamuel Khuvis void* ps_timer_create_(const char *timer_name) {
245a0c7f9aaSSamuel Khuvis     #ifndef PERFSTUBS_OFF
246a0c7f9aaSSamuel Khuvis     void ** objects = (void**)calloc(num_tools_registered, sizeof(void*));
247a0c7f9aaSSamuel Khuvis     int i;
248a0c7f9aaSSamuel Khuvis     for (i = 0 ; i < num_tools_registered ; i++) {
249a0c7f9aaSSamuel Khuvis         objects[i] = (void*)timer_create_functions[i](timer_name);
250a0c7f9aaSSamuel Khuvis     }
251a0c7f9aaSSamuel Khuvis     return (void*)(objects);
252a0c7f9aaSSamuel Khuvis     #else
253a0c7f9aaSSamuel Khuvis     return NULL;
254a0c7f9aaSSamuel Khuvis     #endif
255a0c7f9aaSSamuel Khuvis }
256a0c7f9aaSSamuel Khuvis 
257*6f933394SToby Isaac void ps_timer_destroy_(void *objects) {
258*6f933394SToby Isaac     #ifndef PERFSTUBS_OFF
259*6f933394SToby Isaac     free(objects);
260*6f933394SToby Isaac     #endif
261*6f933394SToby Isaac }
262*6f933394SToby Isaac 
263a0c7f9aaSSamuel Khuvis void ps_timer_create_fortran_(void ** object, const char *timer_name) {
264a0c7f9aaSSamuel Khuvis     #ifndef PERFSTUBS_OFF
265a0c7f9aaSSamuel Khuvis     *object = ps_timer_create_(timer_name);
266a0c7f9aaSSamuel Khuvis     #endif
267a0c7f9aaSSamuel Khuvis }
268a0c7f9aaSSamuel Khuvis 
269a0c7f9aaSSamuel Khuvis void ps_timer_start_(const void *timer) {
270a0c7f9aaSSamuel Khuvis     #ifndef PERFSTUBS_OFF
271a0c7f9aaSSamuel Khuvis     void ** objects = (void**)(timer);
272a0c7f9aaSSamuel Khuvis     int i;
273a0c7f9aaSSamuel Khuvis     for (i = 0; i < num_tools_registered ; i++) {
274a0c7f9aaSSamuel Khuvis         timer_start_functions[i](objects[i]);
275a0c7f9aaSSamuel Khuvis     }
276a0c7f9aaSSamuel Khuvis     #endif
277a0c7f9aaSSamuel Khuvis }
278a0c7f9aaSSamuel Khuvis 
279a0c7f9aaSSamuel Khuvis void ps_timer_start_fortran_(const void **timer) {
280a0c7f9aaSSamuel Khuvis     #ifndef PERFSTUBS_OFF
281a0c7f9aaSSamuel Khuvis     ps_timer_start_(*timer);
282a0c7f9aaSSamuel Khuvis     #endif
283a0c7f9aaSSamuel Khuvis }
284a0c7f9aaSSamuel Khuvis 
285a0c7f9aaSSamuel Khuvis void ps_timer_stop_(const void *timer) {
286a0c7f9aaSSamuel Khuvis     #ifndef PERFSTUBS_OFF
287a0c7f9aaSSamuel Khuvis     void ** objects = (void**)(timer);
288a0c7f9aaSSamuel Khuvis     int i;
289a0c7f9aaSSamuel Khuvis     for (i = 0; i < num_tools_registered ; i++) {
290a0c7f9aaSSamuel Khuvis         timer_stop_functions[i](objects[i]);
291a0c7f9aaSSamuel Khuvis     }
292a0c7f9aaSSamuel Khuvis     #endif
293a0c7f9aaSSamuel Khuvis }
294a0c7f9aaSSamuel Khuvis 
295a0c7f9aaSSamuel Khuvis void ps_timer_stop_fortran_(const void **timer) {
296a0c7f9aaSSamuel Khuvis     #ifndef PERFSTUBS_OFF
297a0c7f9aaSSamuel Khuvis     ps_timer_stop_(*timer);
298a0c7f9aaSSamuel Khuvis     #endif
299a0c7f9aaSSamuel Khuvis }
300a0c7f9aaSSamuel Khuvis 
301a0c7f9aaSSamuel Khuvis void ps_set_parameter_(const char * parameter_name, int64_t parameter_value) {
302a0c7f9aaSSamuel Khuvis     #ifndef PERFSTUBS_OFF
303a0c7f9aaSSamuel Khuvis     int i;
304a0c7f9aaSSamuel Khuvis     for (i = 0; i < num_tools_registered ; i++) {
305a0c7f9aaSSamuel Khuvis         set_parameter_functions[i](parameter_name, parameter_value);
306a0c7f9aaSSamuel Khuvis     }
307a0c7f9aaSSamuel Khuvis     #endif
308a0c7f9aaSSamuel Khuvis }
309a0c7f9aaSSamuel Khuvis 
310a0c7f9aaSSamuel Khuvis void ps_dynamic_phase_start_(const char *phase_prefix, int iteration_index) {
311a0c7f9aaSSamuel Khuvis     #ifndef PERFSTUBS_OFF
312a0c7f9aaSSamuel Khuvis     int i;
313a0c7f9aaSSamuel Khuvis     for (i = 0; i < num_tools_registered ; i++) {
314a0c7f9aaSSamuel Khuvis         dynamic_phase_start_functions[i](phase_prefix, iteration_index);
315a0c7f9aaSSamuel Khuvis     }
316a0c7f9aaSSamuel Khuvis     #endif
317a0c7f9aaSSamuel Khuvis }
318a0c7f9aaSSamuel Khuvis 
319a0c7f9aaSSamuel Khuvis void ps_dynamic_phase_stop_(const char *phase_prefix, int iteration_index) {
320a0c7f9aaSSamuel Khuvis     #ifndef PERFSTUBS_OFF
321a0c7f9aaSSamuel Khuvis     int i;
322a0c7f9aaSSamuel Khuvis     for (i = 0; i < num_tools_registered ; i++) {
323a0c7f9aaSSamuel Khuvis         dynamic_phase_stop_functions[i](phase_prefix, iteration_index);
324a0c7f9aaSSamuel Khuvis     }
325a0c7f9aaSSamuel Khuvis     #endif
326a0c7f9aaSSamuel Khuvis }
327a0c7f9aaSSamuel Khuvis 
328a0c7f9aaSSamuel Khuvis void* ps_create_counter_(const char *name) {
329a0c7f9aaSSamuel Khuvis     #ifndef PERFSTUBS_OFF
330a0c7f9aaSSamuel Khuvis     void ** objects = (void**)calloc(num_tools_registered, sizeof(void*));
331a0c7f9aaSSamuel Khuvis     int i;
332a0c7f9aaSSamuel Khuvis     for (i = 0 ; i < num_tools_registered ; i++) {
333a0c7f9aaSSamuel Khuvis         objects[i] = (void*)create_counter_functions[i](name);
334a0c7f9aaSSamuel Khuvis     }
335a0c7f9aaSSamuel Khuvis     return (void*)(objects);
336a0c7f9aaSSamuel Khuvis     #else
337a0c7f9aaSSamuel Khuvis     return NULL;
338a0c7f9aaSSamuel Khuvis     #endif
339a0c7f9aaSSamuel Khuvis }
340a0c7f9aaSSamuel Khuvis 
341a0c7f9aaSSamuel Khuvis void ps_create_counter_fortran_(void ** object, const char *name) {
342a0c7f9aaSSamuel Khuvis     #ifndef PERFSTUBS_OFF
343a0c7f9aaSSamuel Khuvis     *object = ps_create_counter_(name);
344a0c7f9aaSSamuel Khuvis     #endif
345a0c7f9aaSSamuel Khuvis }
346a0c7f9aaSSamuel Khuvis 
347a0c7f9aaSSamuel Khuvis void ps_sample_counter_(const void *counter, const double value) {
348a0c7f9aaSSamuel Khuvis     #ifndef PERFSTUBS_OFF
349a0c7f9aaSSamuel Khuvis     void ** objects = (void**)(counter);
350a0c7f9aaSSamuel Khuvis     int i;
351a0c7f9aaSSamuel Khuvis     for (i = 0; i < num_tools_registered ; i++) {
352a0c7f9aaSSamuel Khuvis         sample_counter_functions[i](objects[i], value);
353a0c7f9aaSSamuel Khuvis     }
354a0c7f9aaSSamuel Khuvis     #endif
355a0c7f9aaSSamuel Khuvis }
356a0c7f9aaSSamuel Khuvis 
357a0c7f9aaSSamuel Khuvis void ps_sample_counter_fortran_(const void **counter, const double value) {
358a0c7f9aaSSamuel Khuvis     #ifndef PERFSTUBS_OFF
359a0c7f9aaSSamuel Khuvis     ps_sample_counter_(*counter, value);
360a0c7f9aaSSamuel Khuvis     #endif
361a0c7f9aaSSamuel Khuvis }
362a0c7f9aaSSamuel Khuvis 
363a0c7f9aaSSamuel Khuvis void ps_set_metadata_(const char *name, const char *value) {
364a0c7f9aaSSamuel Khuvis     #ifndef PERFSTUBS_OFF
365a0c7f9aaSSamuel Khuvis     int i;
366a0c7f9aaSSamuel Khuvis     for (i = 0; i < num_tools_registered ; i++) {
367a0c7f9aaSSamuel Khuvis         set_metadata_functions[i](name, value);
368a0c7f9aaSSamuel Khuvis     }
369a0c7f9aaSSamuel Khuvis     #endif
370a0c7f9aaSSamuel Khuvis }
371a0c7f9aaSSamuel Khuvis 
372a0c7f9aaSSamuel Khuvis void ps_dump_data_(void) {
373a0c7f9aaSSamuel Khuvis     #ifndef PERFSTUBS_OFF
374a0c7f9aaSSamuel Khuvis     int i;
375a0c7f9aaSSamuel Khuvis     for (i = 0; i < num_tools_registered ; i++) {
376a0c7f9aaSSamuel Khuvis         dump_data_functions[i]();
377a0c7f9aaSSamuel Khuvis     }
378a0c7f9aaSSamuel Khuvis     #endif
379a0c7f9aaSSamuel Khuvis }
380a0c7f9aaSSamuel Khuvis 
381a0c7f9aaSSamuel Khuvis void ps_get_timer_data_(ps_tool_timer_data_t *timer_data, int tool_id) {
382a0c7f9aaSSamuel Khuvis     #ifndef PERFSTUBS_OFF
383a0c7f9aaSSamuel Khuvis     if (tool_id < num_tools_registered) {
384a0c7f9aaSSamuel Khuvis         get_timer_data_functions[tool_id](timer_data);
385a0c7f9aaSSamuel Khuvis     }
386a0c7f9aaSSamuel Khuvis     #endif
387a0c7f9aaSSamuel Khuvis }
388a0c7f9aaSSamuel Khuvis 
389a0c7f9aaSSamuel Khuvis void ps_get_counter_data_(ps_tool_counter_data_t *counter_data, int tool_id) {
390a0c7f9aaSSamuel Khuvis     #ifndef PERFSTUBS_OFF
391a0c7f9aaSSamuel Khuvis     if (tool_id < num_tools_registered) {
392a0c7f9aaSSamuel Khuvis         get_counter_data_functions[tool_id](counter_data);
393a0c7f9aaSSamuel Khuvis     }
394a0c7f9aaSSamuel Khuvis     #endif
395a0c7f9aaSSamuel Khuvis }
396a0c7f9aaSSamuel Khuvis 
397a0c7f9aaSSamuel Khuvis void ps_get_metadata_(ps_tool_metadata_t *metadata, int tool_id) {
398a0c7f9aaSSamuel Khuvis     #ifndef PERFSTUBS_OFF
399a0c7f9aaSSamuel Khuvis     if (tool_id < num_tools_registered) {
400a0c7f9aaSSamuel Khuvis         get_metadata_functions[tool_id](metadata);
401a0c7f9aaSSamuel Khuvis     }
402a0c7f9aaSSamuel Khuvis     #endif
403a0c7f9aaSSamuel Khuvis }
404a0c7f9aaSSamuel Khuvis 
405a0c7f9aaSSamuel Khuvis void ps_free_timer_data_(ps_tool_timer_data_t *timer_data, int tool_id) {
406a0c7f9aaSSamuel Khuvis     #ifndef PERFSTUBS_OFF
407a0c7f9aaSSamuel Khuvis     if (tool_id < num_tools_registered) {
408a0c7f9aaSSamuel Khuvis         free_timer_data_functions[tool_id](timer_data);
409a0c7f9aaSSamuel Khuvis     }
410a0c7f9aaSSamuel Khuvis     #endif
411a0c7f9aaSSamuel Khuvis }
412a0c7f9aaSSamuel Khuvis 
413a0c7f9aaSSamuel Khuvis void ps_free_counter_data_(ps_tool_counter_data_t *counter_data, int tool_id) {
414a0c7f9aaSSamuel Khuvis     #ifndef PERFSTUBS_OFF
415a0c7f9aaSSamuel Khuvis     if (tool_id < num_tools_registered) {
416a0c7f9aaSSamuel Khuvis         free_counter_data_functions[tool_id](counter_data);
417a0c7f9aaSSamuel Khuvis     }
418a0c7f9aaSSamuel Khuvis     #endif
419a0c7f9aaSSamuel Khuvis }
420a0c7f9aaSSamuel Khuvis 
421a0c7f9aaSSamuel Khuvis void ps_free_metadata_(ps_tool_metadata_t *metadata, int tool_id) {
422a0c7f9aaSSamuel Khuvis     #ifndef PERFSTUBS_OFF
423a0c7f9aaSSamuel Khuvis     if (tool_id < num_tools_registered) {
424a0c7f9aaSSamuel Khuvis         free_metadata_functions[tool_id](metadata);
425a0c7f9aaSSamuel Khuvis     }
426a0c7f9aaSSamuel Khuvis     #endif
427a0c7f9aaSSamuel Khuvis }
428