xref: /petsc/src/sys/perfstubs/pstimer.c (revision 834855d6effb0d027771461c8e947ee1ce5a1e17)
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 
initialize_library(void)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;
113*3a7d0413SPierre Jolivet     if (initialize_functions[0] == NULL) return;
114a0c7f9aaSSamuel Khuvis     printf("Found ps_tool_initialize(), registering tool\n");
115a0c7f9aaSSamuel Khuvis     register_thread_functions[0] = &ps_tool_register_thread;
116a0c7f9aaSSamuel Khuvis     finalize_functions[0] = &ps_tool_finalize;
117a0c7f9aaSSamuel Khuvis     dump_data_functions[0] = &ps_tool_dump_data;
118a0c7f9aaSSamuel Khuvis     timer_create_functions[0] = &ps_tool_timer_create;
119a0c7f9aaSSamuel Khuvis     timer_start_functions[0] = &ps_tool_timer_start;
120a0c7f9aaSSamuel Khuvis     timer_stop_functions[0] = &ps_tool_timer_stop;
121a0c7f9aaSSamuel Khuvis     set_parameter_functions[0] = &ps_tool_set_parameter;
122a0c7f9aaSSamuel Khuvis     dynamic_phase_start_functions[0] = &ps_tool_dynamic_phase_start;
123a0c7f9aaSSamuel Khuvis     dynamic_phase_stop_functions[0] = &ps_tool_dynamic_phase_stop;
124a0c7f9aaSSamuel Khuvis     create_counter_functions[0] = &ps_tool_create_counter;
125a0c7f9aaSSamuel Khuvis     sample_counter_functions[0] = &ps_tool_sample_counter;
126a0c7f9aaSSamuel Khuvis     set_metadata_functions[0] = &ps_tool_set_metadata;
127a0c7f9aaSSamuel Khuvis     get_timer_data_functions[0] = &ps_tool_get_timer_data;
128a0c7f9aaSSamuel Khuvis     get_counter_data_functions[0] = &ps_tool_get_counter_data;
129a0c7f9aaSSamuel Khuvis     get_metadata_functions[0] = &ps_tool_get_metadata;
130a0c7f9aaSSamuel Khuvis     free_timer_data_functions[0] = &ps_tool_free_timer_data;
131a0c7f9aaSSamuel Khuvis     free_counter_data_functions[0] = &ps_tool_free_counter_data;
132a0c7f9aaSSamuel Khuvis     free_metadata_functions[0] = &ps_tool_free_metadata;
133a0c7f9aaSSamuel Khuvis #else
134a0c7f9aaSSamuel Khuvis     initialize_functions[0] =
135a0c7f9aaSSamuel Khuvis         (ps_initialize_t)dlsym(RTLD_DEFAULT, "ps_tool_initialize");
136a0c7f9aaSSamuel Khuvis     if (initialize_functions[0] == NULL) {
137a0c7f9aaSSamuel Khuvis         perfstubs_initialized = PERFSTUBS_FAILURE;
138a0c7f9aaSSamuel Khuvis         return;
139a0c7f9aaSSamuel Khuvis     }
140a0c7f9aaSSamuel Khuvis     printf("Found ps_tool_initialize(), registering tool\n");
141a0c7f9aaSSamuel Khuvis     finalize_functions[0] =
142a0c7f9aaSSamuel Khuvis         (ps_finalize_t)dlsym(RTLD_DEFAULT, "ps_tool_finalize");
143a0c7f9aaSSamuel Khuvis     register_thread_functions[0] =
144a0c7f9aaSSamuel Khuvis         (ps_register_thread_t)dlsym(RTLD_DEFAULT, "ps_tool_register_thread");
145a0c7f9aaSSamuel Khuvis     dump_data_functions[0] =
146a0c7f9aaSSamuel Khuvis         (ps_dump_data_t)dlsym(RTLD_DEFAULT, "ps_tool_dump_data");
147a0c7f9aaSSamuel Khuvis     timer_create_functions[0] =
148a0c7f9aaSSamuel Khuvis         (ps_timer_create_t)dlsym(RTLD_DEFAULT,
149a0c7f9aaSSamuel Khuvis         "ps_tool_timer_create");
150a0c7f9aaSSamuel Khuvis     timer_start_functions[0] =
151a0c7f9aaSSamuel Khuvis         (ps_timer_start_t)dlsym(RTLD_DEFAULT, "ps_tool_timer_start");
152a0c7f9aaSSamuel Khuvis     timer_stop_functions[0] =
153a0c7f9aaSSamuel Khuvis         (ps_timer_stop_t)dlsym(RTLD_DEFAULT, "ps_tool_timer_stop");
154a0c7f9aaSSamuel Khuvis     set_parameter_functions[0] =
155a0c7f9aaSSamuel Khuvis         (ps_set_parameter_t)dlsym(RTLD_DEFAULT, "ps_tool_set_parameter");
156a0c7f9aaSSamuel Khuvis     dynamic_phase_start_functions[0] = (ps_dynamic_phase_start_t)dlsym(
157a0c7f9aaSSamuel Khuvis         RTLD_DEFAULT, "ps_tool_dynamic_phase_start");
158a0c7f9aaSSamuel Khuvis     dynamic_phase_stop_functions[0] = (ps_dynamic_phase_stop_t)dlsym(
159a0c7f9aaSSamuel Khuvis         RTLD_DEFAULT, "ps_tool_dynamic_phase_stop");
160a0c7f9aaSSamuel Khuvis     create_counter_functions[0] = (ps_create_counter_t)dlsym(
161a0c7f9aaSSamuel Khuvis         RTLD_DEFAULT, "ps_tool_create_counter");
162a0c7f9aaSSamuel Khuvis     sample_counter_functions[0] = (ps_sample_counter_t)dlsym(
163a0c7f9aaSSamuel Khuvis         RTLD_DEFAULT, "ps_tool_sample_counter");
164a0c7f9aaSSamuel Khuvis     set_metadata_functions[0] =
165a0c7f9aaSSamuel Khuvis         (ps_set_metadata_t)dlsym(RTLD_DEFAULT, "ps_tool_set_metadata");
166a0c7f9aaSSamuel Khuvis     get_timer_data_functions[0] = (ps_get_timer_data_t)dlsym(
167a0c7f9aaSSamuel Khuvis         RTLD_DEFAULT, "ps_tool_get_timer_data");
168a0c7f9aaSSamuel Khuvis     get_counter_data_functions[0] = (ps_get_counter_data_t)dlsym(
169a0c7f9aaSSamuel Khuvis         RTLD_DEFAULT, "ps_tool_get_counter_data");
170a0c7f9aaSSamuel Khuvis     get_metadata_functions[0] = (ps_get_metadata_t)dlsym(
171a0c7f9aaSSamuel Khuvis         RTLD_DEFAULT, "ps_tool_get_metadata");
172a0c7f9aaSSamuel Khuvis     free_timer_data_functions[0] = (ps_free_timer_data_t)dlsym(
173a0c7f9aaSSamuel Khuvis         RTLD_DEFAULT, "ps_tool_free_timer_data");
174a0c7f9aaSSamuel Khuvis     free_counter_data_functions[0] = (ps_free_counter_data_t)dlsym(
175a0c7f9aaSSamuel Khuvis         RTLD_DEFAULT, "ps_tool_free_counter_data");
176a0c7f9aaSSamuel Khuvis     free_metadata_functions[0] = (ps_free_metadata_t)dlsym(
177a0c7f9aaSSamuel Khuvis         RTLD_DEFAULT, "ps_tool_free_metadata");
178a0c7f9aaSSamuel Khuvis #endif
179a0c7f9aaSSamuel Khuvis     perfstubs_initialized = PERFSTUBS_SUCCESS;
180a0c7f9aaSSamuel Khuvis     /* Increment the number of tools */
181a0c7f9aaSSamuel Khuvis     num_tools_registered = 1;
182a0c7f9aaSSamuel Khuvis #endif //PERFSTUBS_OFF
183a0c7f9aaSSamuel Khuvis }
184a0c7f9aaSSamuel Khuvis #ifndef PERFSTUBS_OFF
185a0c7f9aaSSamuel Khuvis #pragma GCC diagnostic pop  // Restore diagnostics state
186a0c7f9aaSSamuel Khuvis #endif
187a0c7f9aaSSamuel Khuvis 
ps_make_timer_name_(const char * file,const char * func,int line)188a0c7f9aaSSamuel Khuvis char * ps_make_timer_name_(const char * file,
189a0c7f9aaSSamuel Khuvis     const char * func, int line) {
190a0c7f9aaSSamuel Khuvis     #ifndef PERFSTUBS_OFF
191a0c7f9aaSSamuel Khuvis   /* The length of the line number as a string is floor(log10(abs(num))) */
1926497c311SBarry Smith   int string_length = (int) ((strlen(file) + strlen(func) + floor(log10(abs(line))) + 11));
193a0c7f9aaSSamuel Khuvis     char * name = (char*)calloc(string_length, sizeof(char));
194a0c7f9aaSSamuel Khuvis     sprintf(name, "%s [{%s} {%d,0}]", func, file, line);
195a0c7f9aaSSamuel Khuvis     return (name);
196a0c7f9aaSSamuel Khuvis     #else
197a0c7f9aaSSamuel Khuvis     return NULL;
198a0c7f9aaSSamuel Khuvis     #endif
199a0c7f9aaSSamuel Khuvis }
200a0c7f9aaSSamuel Khuvis 
201a0c7f9aaSSamuel Khuvis // used internally to the class
ps_register_thread_internal(void)202a0c7f9aaSSamuel Khuvis void ps_register_thread_internal(void) {
203a0c7f9aaSSamuel Khuvis #ifndef PERFSTUBS_OFF
204a0c7f9aaSSamuel Khuvis     	int i;
205*3a7d0413SPierre Jolivet     for (i = 0 ; i < num_tools_registered ; i++) register_thread_functions[i]();
206a0c7f9aaSSamuel Khuvis     thread_seen = 1;
207a0c7f9aaSSamuel Khuvis #endif
208a0c7f9aaSSamuel Khuvis }
209a0c7f9aaSSamuel Khuvis 
210a0c7f9aaSSamuel Khuvis /* Initialization */
ps_initialize_(void)211a0c7f9aaSSamuel Khuvis void ps_initialize_(void) {
212a0c7f9aaSSamuel Khuvis #ifndef PERFSTUBS_OFF
213a0c7f9aaSSamuel Khuvis     int i;
214a0c7f9aaSSamuel Khuvis     initialize_library();
215*3a7d0413SPierre Jolivet     for (i = 0 ; i < num_tools_registered ; i++) initialize_functions[i]();
216a0c7f9aaSSamuel Khuvis     /* No need to register the main thread */
217a0c7f9aaSSamuel Khuvis     thread_seen = 1;
218a0c7f9aaSSamuel Khuvis #endif
219a0c7f9aaSSamuel Khuvis }
220a0c7f9aaSSamuel Khuvis 
ps_finalize_(void)221a0c7f9aaSSamuel Khuvis void ps_finalize_(void) {
222a0c7f9aaSSamuel Khuvis     #ifndef PERFSTUBS_OFF
223a0c7f9aaSSamuel Khuvis     int i;
224*3a7d0413SPierre Jolivet     for (i = 0 ; i < num_tools_registered ; i++) finalize_functions[i]();
225a0c7f9aaSSamuel Khuvis     #endif
226a0c7f9aaSSamuel Khuvis }
227a0c7f9aaSSamuel Khuvis 
ps_register_thread_(void)228a0c7f9aaSSamuel Khuvis void ps_register_thread_(void) {
229a0c7f9aaSSamuel Khuvis #ifndef PERFSTUBS_OFF
230*3a7d0413SPierre Jolivet     if (thread_seen == 0) ps_register_thread_internal();
231a0c7f9aaSSamuel Khuvis #endif
232a0c7f9aaSSamuel Khuvis }
233a0c7f9aaSSamuel Khuvis 
ps_timer_create_(const char * timer_name)234a0c7f9aaSSamuel Khuvis void* ps_timer_create_(const char *timer_name) {
235a0c7f9aaSSamuel Khuvis     #ifndef PERFSTUBS_OFF
236a0c7f9aaSSamuel Khuvis     void ** objects = (void**)calloc(num_tools_registered, sizeof(void*));
237a0c7f9aaSSamuel Khuvis     int i;
238*3a7d0413SPierre Jolivet     for (i = 0 ; i < num_tools_registered ; i++) objects[i] = timer_create_functions[i](timer_name);
239a0c7f9aaSSamuel Khuvis     return (void*)(objects);
240a0c7f9aaSSamuel Khuvis     #else
241a0c7f9aaSSamuel Khuvis     return NULL;
242a0c7f9aaSSamuel Khuvis     #endif
243a0c7f9aaSSamuel Khuvis }
244a0c7f9aaSSamuel Khuvis 
ps_timer_destroy_(void * objects)2456f933394SToby Isaac void ps_timer_destroy_(void *objects) {
2466f933394SToby Isaac     #ifndef PERFSTUBS_OFF
2476f933394SToby Isaac     free(objects);
2486f933394SToby Isaac     #endif
2496f933394SToby Isaac }
2506f933394SToby Isaac 
ps_timer_create_fortran_(void ** object,const char * timer_name)251a0c7f9aaSSamuel Khuvis void ps_timer_create_fortran_(void ** object, const char *timer_name) {
252a0c7f9aaSSamuel Khuvis     #ifndef PERFSTUBS_OFF
253a0c7f9aaSSamuel Khuvis     *object = ps_timer_create_(timer_name);
254a0c7f9aaSSamuel Khuvis     #endif
255a0c7f9aaSSamuel Khuvis }
256a0c7f9aaSSamuel Khuvis 
ps_timer_start_(const void * timer)257a0c7f9aaSSamuel Khuvis void ps_timer_start_(const void *timer) {
258a0c7f9aaSSamuel Khuvis     #ifndef PERFSTUBS_OFF
259a0c7f9aaSSamuel Khuvis     void ** objects = (void**)(timer);
260a0c7f9aaSSamuel Khuvis     int i;
261*3a7d0413SPierre Jolivet     for (i = 0; i < num_tools_registered ; i++) timer_start_functions[i](objects[i]);
262a0c7f9aaSSamuel Khuvis     #endif
263a0c7f9aaSSamuel Khuvis }
264a0c7f9aaSSamuel Khuvis 
ps_timer_start_fortran_(const void ** timer)265a0c7f9aaSSamuel Khuvis void ps_timer_start_fortran_(const void **timer) {
266a0c7f9aaSSamuel Khuvis     #ifndef PERFSTUBS_OFF
267a0c7f9aaSSamuel Khuvis     ps_timer_start_(*timer);
268a0c7f9aaSSamuel Khuvis     #endif
269a0c7f9aaSSamuel Khuvis }
270a0c7f9aaSSamuel Khuvis 
ps_timer_stop_(const void * timer)271a0c7f9aaSSamuel Khuvis void ps_timer_stop_(const void *timer) {
272a0c7f9aaSSamuel Khuvis     #ifndef PERFSTUBS_OFF
273a0c7f9aaSSamuel Khuvis     void ** objects = (void**)(timer);
274a0c7f9aaSSamuel Khuvis     int i;
275*3a7d0413SPierre Jolivet     for (i = 0; i < num_tools_registered ; i++) timer_stop_functions[i](objects[i]);
276a0c7f9aaSSamuel Khuvis     #endif
277a0c7f9aaSSamuel Khuvis }
278a0c7f9aaSSamuel Khuvis 
ps_timer_stop_fortran_(const void ** timer)279a0c7f9aaSSamuel Khuvis void ps_timer_stop_fortran_(const void **timer) {
280a0c7f9aaSSamuel Khuvis     #ifndef PERFSTUBS_OFF
281a0c7f9aaSSamuel Khuvis     ps_timer_stop_(*timer);
282a0c7f9aaSSamuel Khuvis     #endif
283a0c7f9aaSSamuel Khuvis }
284a0c7f9aaSSamuel Khuvis 
ps_set_parameter_(const char * parameter_name,int64_t parameter_value)285a0c7f9aaSSamuel Khuvis void ps_set_parameter_(const char * parameter_name, int64_t parameter_value) {
286a0c7f9aaSSamuel Khuvis     #ifndef PERFSTUBS_OFF
287a0c7f9aaSSamuel Khuvis     int i;
288*3a7d0413SPierre Jolivet     for (i = 0; i < num_tools_registered ; i++) set_parameter_functions[i](parameter_name, parameter_value);
289a0c7f9aaSSamuel Khuvis     #endif
290a0c7f9aaSSamuel Khuvis }
291a0c7f9aaSSamuel Khuvis 
ps_dynamic_phase_start_(const char * phase_prefix,int iteration_index)292a0c7f9aaSSamuel Khuvis void ps_dynamic_phase_start_(const char *phase_prefix, int iteration_index) {
293a0c7f9aaSSamuel Khuvis     #ifndef PERFSTUBS_OFF
294a0c7f9aaSSamuel Khuvis     int i;
295*3a7d0413SPierre Jolivet     for (i = 0; i < num_tools_registered ; i++) dynamic_phase_start_functions[i](phase_prefix, iteration_index);
296a0c7f9aaSSamuel Khuvis     #endif
297a0c7f9aaSSamuel Khuvis }
298a0c7f9aaSSamuel Khuvis 
ps_dynamic_phase_stop_(const char * phase_prefix,int iteration_index)299a0c7f9aaSSamuel Khuvis void ps_dynamic_phase_stop_(const char *phase_prefix, int iteration_index) {
300a0c7f9aaSSamuel Khuvis     #ifndef PERFSTUBS_OFF
301a0c7f9aaSSamuel Khuvis     int i;
302*3a7d0413SPierre Jolivet     for (i = 0; i < num_tools_registered ; i++) dynamic_phase_stop_functions[i](phase_prefix, iteration_index);
303a0c7f9aaSSamuel Khuvis     #endif
304a0c7f9aaSSamuel Khuvis }
305a0c7f9aaSSamuel Khuvis 
ps_create_counter_(const char * name)306a0c7f9aaSSamuel Khuvis void* ps_create_counter_(const char *name) {
307a0c7f9aaSSamuel Khuvis     #ifndef PERFSTUBS_OFF
308a0c7f9aaSSamuel Khuvis     void ** objects = (void**)calloc(num_tools_registered, sizeof(void*));
309a0c7f9aaSSamuel Khuvis     int i;
310*3a7d0413SPierre Jolivet     for (i = 0 ; i < num_tools_registered ; i++) objects[i] = create_counter_functions[i](name);
311a0c7f9aaSSamuel Khuvis     return (void*)(objects);
312a0c7f9aaSSamuel Khuvis     #else
313a0c7f9aaSSamuel Khuvis     return NULL;
314a0c7f9aaSSamuel Khuvis     #endif
315a0c7f9aaSSamuel Khuvis }
316a0c7f9aaSSamuel Khuvis 
ps_create_counter_fortran_(void ** object,const char * name)317a0c7f9aaSSamuel Khuvis void ps_create_counter_fortran_(void ** object, const char *name) {
318a0c7f9aaSSamuel Khuvis     #ifndef PERFSTUBS_OFF
319a0c7f9aaSSamuel Khuvis     *object = ps_create_counter_(name);
320a0c7f9aaSSamuel Khuvis     #endif
321a0c7f9aaSSamuel Khuvis }
322a0c7f9aaSSamuel Khuvis 
ps_sample_counter_(const void * counter,const double value)323a0c7f9aaSSamuel Khuvis void ps_sample_counter_(const void *counter, const double value) {
324a0c7f9aaSSamuel Khuvis     #ifndef PERFSTUBS_OFF
325a0c7f9aaSSamuel Khuvis     void ** objects = (void**)(counter);
326a0c7f9aaSSamuel Khuvis     int i;
327*3a7d0413SPierre Jolivet     for (i = 0; i < num_tools_registered ; i++) sample_counter_functions[i](objects[i], value);
328a0c7f9aaSSamuel Khuvis     #endif
329a0c7f9aaSSamuel Khuvis }
330a0c7f9aaSSamuel Khuvis 
ps_sample_counter_fortran_(const void ** counter,const double value)331a0c7f9aaSSamuel Khuvis void ps_sample_counter_fortran_(const void **counter, const double value) {
332a0c7f9aaSSamuel Khuvis     #ifndef PERFSTUBS_OFF
333a0c7f9aaSSamuel Khuvis     ps_sample_counter_(*counter, value);
334a0c7f9aaSSamuel Khuvis     #endif
335a0c7f9aaSSamuel Khuvis }
336a0c7f9aaSSamuel Khuvis 
ps_set_metadata_(const char * name,const char * value)337a0c7f9aaSSamuel Khuvis void ps_set_metadata_(const char *name, const char *value) {
338a0c7f9aaSSamuel Khuvis     #ifndef PERFSTUBS_OFF
339a0c7f9aaSSamuel Khuvis     int i;
340*3a7d0413SPierre Jolivet     for (i = 0; i < num_tools_registered ; i++) set_metadata_functions[i](name, value);
341a0c7f9aaSSamuel Khuvis     #endif
342a0c7f9aaSSamuel Khuvis }
343a0c7f9aaSSamuel Khuvis 
ps_dump_data_(void)344a0c7f9aaSSamuel Khuvis void ps_dump_data_(void) {
345a0c7f9aaSSamuel Khuvis     #ifndef PERFSTUBS_OFF
346a0c7f9aaSSamuel Khuvis     int i;
347*3a7d0413SPierre Jolivet     for (i = 0; i < num_tools_registered ; i++) dump_data_functions[i]();
348a0c7f9aaSSamuel Khuvis     #endif
349a0c7f9aaSSamuel Khuvis }
350a0c7f9aaSSamuel Khuvis 
ps_get_timer_data_(ps_tool_timer_data_t * timer_data,int tool_id)351a0c7f9aaSSamuel Khuvis void ps_get_timer_data_(ps_tool_timer_data_t *timer_data, int tool_id) {
352a0c7f9aaSSamuel Khuvis     #ifndef PERFSTUBS_OFF
353*3a7d0413SPierre Jolivet     if (tool_id < num_tools_registered) get_timer_data_functions[tool_id](timer_data);
354a0c7f9aaSSamuel Khuvis     #endif
355a0c7f9aaSSamuel Khuvis }
356a0c7f9aaSSamuel Khuvis 
ps_get_counter_data_(ps_tool_counter_data_t * counter_data,int tool_id)357a0c7f9aaSSamuel Khuvis void ps_get_counter_data_(ps_tool_counter_data_t *counter_data, int tool_id) {
358a0c7f9aaSSamuel Khuvis     #ifndef PERFSTUBS_OFF
359*3a7d0413SPierre Jolivet     if (tool_id < num_tools_registered) get_counter_data_functions[tool_id](counter_data);
360a0c7f9aaSSamuel Khuvis     #endif
361a0c7f9aaSSamuel Khuvis }
362a0c7f9aaSSamuel Khuvis 
ps_get_metadata_(ps_tool_metadata_t * metadata,int tool_id)363a0c7f9aaSSamuel Khuvis void ps_get_metadata_(ps_tool_metadata_t *metadata, int tool_id) {
364a0c7f9aaSSamuel Khuvis     #ifndef PERFSTUBS_OFF
365*3a7d0413SPierre Jolivet     if (tool_id < num_tools_registered) get_metadata_functions[tool_id](metadata);
366a0c7f9aaSSamuel Khuvis     #endif
367a0c7f9aaSSamuel Khuvis }
368a0c7f9aaSSamuel Khuvis 
ps_free_timer_data_(ps_tool_timer_data_t * timer_data,int tool_id)369a0c7f9aaSSamuel Khuvis void ps_free_timer_data_(ps_tool_timer_data_t *timer_data, int tool_id) {
370a0c7f9aaSSamuel Khuvis     #ifndef PERFSTUBS_OFF
371*3a7d0413SPierre Jolivet     if (tool_id < num_tools_registered) free_timer_data_functions[tool_id](timer_data);
372a0c7f9aaSSamuel Khuvis     #endif
373a0c7f9aaSSamuel Khuvis }
374a0c7f9aaSSamuel Khuvis 
ps_free_counter_data_(ps_tool_counter_data_t * counter_data,int tool_id)375a0c7f9aaSSamuel Khuvis void ps_free_counter_data_(ps_tool_counter_data_t *counter_data, int tool_id) {
376a0c7f9aaSSamuel Khuvis     #ifndef PERFSTUBS_OFF
377*3a7d0413SPierre Jolivet     if (tool_id < num_tools_registered) free_counter_data_functions[tool_id](counter_data);
378a0c7f9aaSSamuel Khuvis     #endif
379a0c7f9aaSSamuel Khuvis }
380a0c7f9aaSSamuel Khuvis 
ps_free_metadata_(ps_tool_metadata_t * metadata,int tool_id)381a0c7f9aaSSamuel Khuvis void ps_free_metadata_(ps_tool_metadata_t *metadata, int tool_id) {
382a0c7f9aaSSamuel Khuvis     #ifndef PERFSTUBS_OFF
383*3a7d0413SPierre Jolivet     if (tool_id < num_tools_registered) free_metadata_functions[tool_id](metadata);
384a0c7f9aaSSamuel Khuvis     #endif
385a0c7f9aaSSamuel Khuvis }
386