1*a0c7f9aaSSamuel Khuvis // Copyright (c) 2019 University of Oregon 2*a0c7f9aaSSamuel Khuvis // Distributed under the BSD Software License 3*a0c7f9aaSSamuel Khuvis // (See accompanying file LICENSE.txt) 4*a0c7f9aaSSamuel Khuvis 5*a0c7f9aaSSamuel Khuvis #pragma once 6*a0c7f9aaSSamuel Khuvis #include <stdint.h> 7*a0c7f9aaSSamuel Khuvis 8*a0c7f9aaSSamuel Khuvis /****************************************************************************/ 9*a0c7f9aaSSamuel Khuvis /* Declare the structures that a tool should use to return performance data. */ 10*a0c7f9aaSSamuel Khuvis /****************************************************************************/ 11*a0c7f9aaSSamuel Khuvis 12*a0c7f9aaSSamuel Khuvis typedef struct ps_tool_timer_data 13*a0c7f9aaSSamuel Khuvis { 14*a0c7f9aaSSamuel Khuvis unsigned int num_timers; 15*a0c7f9aaSSamuel Khuvis unsigned int num_threads; 16*a0c7f9aaSSamuel Khuvis unsigned int num_metrics; 17*a0c7f9aaSSamuel Khuvis char **timer_names; 18*a0c7f9aaSSamuel Khuvis char **metric_names; 19*a0c7f9aaSSamuel Khuvis double *values; 20*a0c7f9aaSSamuel Khuvis } ps_tool_timer_data_t; 21*a0c7f9aaSSamuel Khuvis 22*a0c7f9aaSSamuel Khuvis typedef struct ps_tool_counter_data 23*a0c7f9aaSSamuel Khuvis { 24*a0c7f9aaSSamuel Khuvis unsigned int num_counters; 25*a0c7f9aaSSamuel Khuvis unsigned int num_threads; 26*a0c7f9aaSSamuel Khuvis char **counter_names; 27*a0c7f9aaSSamuel Khuvis double *num_samples; 28*a0c7f9aaSSamuel Khuvis double *value_total; 29*a0c7f9aaSSamuel Khuvis double *value_min; 30*a0c7f9aaSSamuel Khuvis double *value_max; 31*a0c7f9aaSSamuel Khuvis double *value_sumsqr; 32*a0c7f9aaSSamuel Khuvis } ps_tool_counter_data_t; 33*a0c7f9aaSSamuel Khuvis 34*a0c7f9aaSSamuel Khuvis typedef struct ps_tool_metadata 35*a0c7f9aaSSamuel Khuvis { 36*a0c7f9aaSSamuel Khuvis unsigned int num_values; 37*a0c7f9aaSSamuel Khuvis char **names; 38*a0c7f9aaSSamuel Khuvis char **values; 39*a0c7f9aaSSamuel Khuvis } ps_tool_metadata_t; 40*a0c7f9aaSSamuel Khuvis 41*a0c7f9aaSSamuel Khuvis /****************************************************************************/ 42*a0c7f9aaSSamuel Khuvis /* Declare the typedefs of the functions that a tool should implement. */ 43*a0c7f9aaSSamuel Khuvis /****************************************************************************/ 44*a0c7f9aaSSamuel Khuvis 45*a0c7f9aaSSamuel Khuvis /* Logistical functions */ 46*a0c7f9aaSSamuel Khuvis typedef void (*ps_initialize_t)(void); 47*a0c7f9aaSSamuel Khuvis typedef void (*ps_finalize_t)(void); 48*a0c7f9aaSSamuel Khuvis typedef void (*ps_register_thread_t)(void); 49*a0c7f9aaSSamuel Khuvis typedef void (*ps_dump_data_t)(void); 50*a0c7f9aaSSamuel Khuvis /* Data entry functions */ 51*a0c7f9aaSSamuel Khuvis typedef void* (*ps_timer_create_t)(const char *); 52*a0c7f9aaSSamuel Khuvis typedef void (*ps_timer_start_t)(const void *); 53*a0c7f9aaSSamuel Khuvis typedef void (*ps_timer_stop_t)(const void *); 54*a0c7f9aaSSamuel Khuvis typedef void (*ps_set_parameter_t)(const char *, int64_t); 55*a0c7f9aaSSamuel Khuvis typedef void (*ps_dynamic_phase_start_t)(const char *, int); 56*a0c7f9aaSSamuel Khuvis typedef void (*ps_dynamic_phase_stop_t)(const char *, int); 57*a0c7f9aaSSamuel Khuvis typedef void* (*ps_create_counter_t)(const char *); 58*a0c7f9aaSSamuel Khuvis typedef void (*ps_sample_counter_t)(const void *, double); 59*a0c7f9aaSSamuel Khuvis typedef void (*ps_set_metadata_t)(const char *, const char *); 60*a0c7f9aaSSamuel Khuvis /* Data Query Functions */ 61*a0c7f9aaSSamuel Khuvis typedef void (*ps_get_timer_data_t)(ps_tool_timer_data_t *); 62*a0c7f9aaSSamuel Khuvis typedef void (*ps_get_counter_data_t)(ps_tool_counter_data_t *); 63*a0c7f9aaSSamuel Khuvis typedef void (*ps_get_metadata_t)(ps_tool_metadata_t *); 64*a0c7f9aaSSamuel Khuvis typedef void (*ps_free_timer_data_t)(ps_tool_timer_data_t *); 65*a0c7f9aaSSamuel Khuvis typedef void (*ps_free_counter_data_t)(ps_tool_counter_data_t *); 66*a0c7f9aaSSamuel Khuvis typedef void (*ps_free_metadata_t)(ps_tool_metadata_t *); 67*a0c7f9aaSSamuel Khuvis 68*a0c7f9aaSSamuel Khuvis /****************************************************************************/ 69*a0c7f9aaSSamuel Khuvis /* Declare the structure used to register a tool */ 70*a0c7f9aaSSamuel Khuvis /****************************************************************************/ 71*a0c7f9aaSSamuel Khuvis 72*a0c7f9aaSSamuel Khuvis typedef struct ps_plugin_data { 73*a0c7f9aaSSamuel Khuvis char * tool_name; 74*a0c7f9aaSSamuel Khuvis /* Logistical functions */ 75*a0c7f9aaSSamuel Khuvis ps_initialize_t initialize; 76*a0c7f9aaSSamuel Khuvis ps_finalize_t finalize; 77*a0c7f9aaSSamuel Khuvis ps_register_thread_t register_thread; 78*a0c7f9aaSSamuel Khuvis ps_dump_data_t dump_data; 79*a0c7f9aaSSamuel Khuvis /* Data entry functions */ 80*a0c7f9aaSSamuel Khuvis ps_timer_create_t timer_create; 81*a0c7f9aaSSamuel Khuvis ps_timer_start_t timer_start; 82*a0c7f9aaSSamuel Khuvis ps_timer_stop_t timer_stop; 83*a0c7f9aaSSamuel Khuvis ps_set_parameter_t set_parameter; 84*a0c7f9aaSSamuel Khuvis ps_dynamic_phase_start_t dynamic_phase_start; 85*a0c7f9aaSSamuel Khuvis ps_dynamic_phase_stop_t dynamic_phase_stop; 86*a0c7f9aaSSamuel Khuvis ps_create_counter_t create_counter; 87*a0c7f9aaSSamuel Khuvis ps_sample_counter_t sample_counter; 88*a0c7f9aaSSamuel Khuvis ps_set_metadata_t set_metadata; 89*a0c7f9aaSSamuel Khuvis /* Data Query Functions */ 90*a0c7f9aaSSamuel Khuvis ps_get_timer_data_t get_timer_data; 91*a0c7f9aaSSamuel Khuvis ps_get_counter_data_t get_counter_data; 92*a0c7f9aaSSamuel Khuvis ps_get_metadata_t get_metadata; 93*a0c7f9aaSSamuel Khuvis ps_free_timer_data_t free_timer_data; 94*a0c7f9aaSSamuel Khuvis ps_free_counter_data_t free_counter_data; 95*a0c7f9aaSSamuel Khuvis ps_free_metadata_t free_metadata; 96*a0c7f9aaSSamuel Khuvis } ps_plugin_data_t; 97*a0c7f9aaSSamuel Khuvis 98*a0c7f9aaSSamuel Khuvis /****************************************************************************/ 99*a0c7f9aaSSamuel Khuvis /* Declare the register/deregister weak symbols (implemented by the plugin API 100*a0c7f9aaSSamuel Khuvis * for the registration process */ 101*a0c7f9aaSSamuel Khuvis /****************************************************************************/ 102*a0c7f9aaSSamuel Khuvis 103*a0c7f9aaSSamuel Khuvis typedef int (*ps_register_t)(ps_plugin_data_t *); 104*a0c7f9aaSSamuel Khuvis typedef void (*ps_deregister_t)(int); 105*a0c7f9aaSSamuel Khuvis 106*a0c7f9aaSSamuel Khuvis #ifdef __cplusplus 107*a0c7f9aaSSamuel Khuvis extern "C" { 108*a0c7f9aaSSamuel Khuvis #endif 109*a0c7f9aaSSamuel Khuvis 110*a0c7f9aaSSamuel Khuvis #ifdef __linux__ 111*a0c7f9aaSSamuel Khuvis extern __attribute__((weak)) int ps_register_tool(ps_plugin_data_t * tool); 112*a0c7f9aaSSamuel Khuvis extern __attribute__((weak)) void ps_deregister_tool(int tool_id); 113*a0c7f9aaSSamuel Khuvis #else /* use _WIN32 or _WIN64 */ 114*a0c7f9aaSSamuel Khuvis extern int ps_register_tool(ps_plugin_data_t * tool); 115*a0c7f9aaSSamuel Khuvis extern void ps_deregister_tool(int tool_id); 116*a0c7f9aaSSamuel Khuvis #endif 117*a0c7f9aaSSamuel Khuvis 118*a0c7f9aaSSamuel Khuvis #ifdef __cplusplus 119*a0c7f9aaSSamuel Khuvis } 120*a0c7f9aaSSamuel Khuvis #endif 121*a0c7f9aaSSamuel Khuvis 122