1eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin/************************************************************************ 2eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick TjinCopyright (c) 2015, The Linux Foundation. All rights reserved. 3eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin 4eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick TjinRedistribution and use in source and binary forms, with or without 5eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjinmodification, are permitted provided that the following conditions are 6eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjinmet: 7eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin * Redistributions of source code must retain the above copyright 8eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin notice, this list of conditions and the following disclaimer. 9eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin * Redistributions in binary form must reproduce the above 10eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin copyright notice, this list of conditions and the following 11eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin disclaimer in the documentation and/or other materials provided 12eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin with the distribution. 13eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin * Neither the name of The Linux Foundation nor the names of its 14eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin contributors may be used to endorse or promote products derived 15eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin from this software without specific prior written permission. 16eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin 17eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick TjinTHIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED 18eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick TjinWARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 19eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick TjinMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT 20eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick TjinARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS 21eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick TjinBE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 22eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick TjinCONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 23eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick TjinSUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR 24eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick TjinBUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 25eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick TjinWHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE 26eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick TjinOR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN 27eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick TjinIF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 28eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin************************************************************************/ 29eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin 30eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin/** 31eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin * @file datatop_interface.h 32eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin * @brief Declares functions held within datatop.c and datatop_helpers.c 33eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin * 34eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin * Declares functions which are held within datatop.c and datatop_helpers.c. 35eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin * Also defines data structures used for storing data gathered during polling 36eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin * such as datapoint names, values, and prefixes along with other valuable 37eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin * information. 38eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin */ 39eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin 40eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin#ifndef DATATOP_INTERFACE_H 41eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin#define DATATOP_INTERFACE_H 42eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin 43eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin#include <inttypes.h> 44eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin#include "datatop_linked_list.h" 45eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin 46eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin#define DTOP_ULONG 0 47eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin#define DTOP_LONG 1 48eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin#define DTOP_UINT 2 49eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin#define DTOP_INT 3 50eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin#define DTOP_UCHAR 4 51eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin#define DTOP_CHAR 5 52eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin#define DTOP_STR 6 53eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin 54eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin#define FILE_ERROR -1 55eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin#define FILE_SUCCESS 0 56eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin#define SKIP 1 57eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin#define DO_NOT_SKIP 0 58eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin#define POPULATED 1 59eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin#define NOT_POPULATED 0 60eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin 61eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin#define DTOP_POLL_OK 0 62eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin#define DTOP_POLL_IO_ERR 1 63eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin#define NOT_CHECKED 0 64eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin 65eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin#define QUIT 1 66eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin 67eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin#define DTOP_DP_MAX_STR_LEN 32 68eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin 69eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin#define DTOP_DP_HFILL .initial_data_populated = NOT_POPULATED, \ 70eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin .skip = 0 71eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin 72eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin/** 73eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin * @struct dtop_data_union 74eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin * @brief Provides the type for dp value. 75eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin */ 76eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjinunion dtop_data_union { 77eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin uint64_t d_ulong; 78eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin int64_t d_long; 79eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin uint32_t d_uint; 80eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin int32_t d_int; 81eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin uint8_t d_uchar; 82eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin int8_t d_char; 83eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin char d_str[DTOP_DP_MAX_STR_LEN]; 84eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin}; 85eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin 86eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin/** 87eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin * @struct dtop_data_point 88eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin * @brief Individual datapoint in a file. 89eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin * 90eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin * @var dtop_data_point::name 91eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin * Stores the datapoints name. 92eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin * @var dtop_data_point::prefix 93eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin * Stores the individual prefix for the dp. 94eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin * @var dtop_data_point::type 95eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin * Type dp value is, see definitions. 96eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin * @var dtop_data_point::initial_data 97eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin * Holds the initial value of the dp the first time it was polled. 98eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin * @var dtop_data_point::initial_data_populated 99eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin * Variable that is changed when initial_data is populated. 100eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin * @var dtop_data_point::data 101eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin * Value of the dp at the most recent poll. 102eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin */ 103eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjinstruct dtop_data_point { 104eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin char *name; 105eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin char *prefix; 106eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin 107eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin /* Results of polling */ 108eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin char type; 109eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin union dtop_data_union initial_data; 110eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin char initial_data_populated; 111eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin union dtop_data_union data; 112eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin 113eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin /* Skip on subsequent polls */ 114eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin char skip; 115eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin}; 116eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin 117eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin/** 118eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin * @struct dtop_data_point_gatherer 119eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin * @brief Struct used to hold data about a set of collected data. 120eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin * 121eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin * @var dtop_data_point_gatherer::prefix 122eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin * Name of directory which data is collected from. 123eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin * @var dtop_data_point_gatherer::file 124eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin * File path that data is collected from. 125eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin * @var dtop_data_point_gatherer::poll 126eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin * Poll function takes a dtop_data_point_gatherer as parameter. 127eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin * int equals, DTOP_POLL_IO_ERR - Poll of dpg unsuccessful, or 128eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin * DTOP_POLL_OK - Poll of dpg successful. 129eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin * @var dtop_data_point_gatherer::data_points 130eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin * Pointer to a dtop_data_point struct (dp). 131eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin * @var dtop_data_point_gatherer::data_points_len 132eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin * Number of elements in the array of dp's the dpg accesses. 133eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin */ 134eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjinstruct dtop_data_point_gatherer { 135eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin char *prefix; 136eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin char *file; 137eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin int (*poll)(struct dtop_data_point_gatherer *dpg); 138eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin void (*deconstruct)(struct dtop_data_point_gatherer *dpg); 139eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin 140eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin struct dtop_data_point *data_points; 141eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin int data_points_len; 142eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin 143eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin /* Private data */ 144eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin void *priv; 145eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin}; 146eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin 147eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjinvoid dtop_register(struct dtop_data_point_gatherer *dpg); 148eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjinvoid dtop_store_dp(struct dtop_data_point *dp, const char *str); 149eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjinvoid dtop_print_dpg(struct dtop_data_point_gatherer *dpg); 150eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjinvoid get_snapshot_diff(struct dtop_linked_list *dpg_list); 151eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjinvoid dtop_print_snapshot_diff(struct dtop_linked_list *dpg_list); 152eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjinvoid dtop_poll(struct dtop_linked_list *dpg_list); 153eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjinint dtop_print_time_at_poll(FILE *fw); 154eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjinint dtop_print_dpg_names_csv(struct dtop_data_point_gatherer *dpg, FILE *fw); 155eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjinint dtop_write_pollingdata_csv(struct dtop_linked_list *dpg_list, FILE *fw); 156eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjinvoid dtop_reset_dp_initial_values(struct dtop_linked_list *dpg_list); 157eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjinvoid deconstruct_dpgs(struct dtop_linked_list *dpg_list); 158eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjinint dtop_print_system_snapshot(char *file); 159eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin 160eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin 161eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin#ifndef HAVE_STRL_FUNCTIONS 162eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin#define strlcpy(X,Y,Z) strcpy(X,Y) 163eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin#define strlcat(X,Y,Z) strcat(X,Y) 164eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin#endif /* HAVE_STRL_FUNCTIONS */ 165eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin 166eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin#endif /* DATATOP_INTERFACE_H */ 167