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