Actual source code: tool.h
1: // Copyright (c) 2019 University of Oregon
2: // Distributed under the BSD Software License
3: // (See accompanying file LICENSE.txt)
5: #pragma once
6: #include <stdint.h>
8: /****************************************************************************/
9: /* Declare the structures that a tool should use to return performance data. */
10: /****************************************************************************/
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;
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;
34: typedef struct ps_tool_metadata
35: {
36: unsigned int num_values;
37: char **names;
38: char **values;
39: } ps_tool_metadata_t;
41: /****************************************************************************/
42: /* Declare the typedefs of the functions that a tool should implement. */
43: /****************************************************************************/
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 *);
68: /****************************************************************************/
69: /* Declare the structure used to register a tool */
70: /****************************************************************************/
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;
98: /****************************************************************************/
99: /* Declare the register/deregister weak symbols (implemented by the plugin API
100: * for the registration process */
101: /****************************************************************************/
103: typedef int (*ps_register_t)(ps_plugin_data_t *);
104: typedef void (*ps_deregister_t)(int);
106: #ifdef __cplusplus
107: extern "C" {
108: #endif
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
118: #ifdef __cplusplus
119: }
120: #endif