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