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