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; 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 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 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 */ 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 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 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 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 2456f933394SToby Isaac void ps_timer_destroy_(void *objects) { 2466f933394SToby Isaac #ifndef PERFSTUBS_OFF 2476f933394SToby Isaac free(objects); 2486f933394SToby Isaac #endif 2496f933394SToby Isaac } 2506f933394SToby Isaac 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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