1sg_comp_init(3)                                                sg_comp_init(3)
2
3
4

NAME

6       sg_comp_init,    sg_comp_destroy,    sg_comp_get_tls,   sg_global_lock,
7       sg_global_unlock - managing system statistics delivery
8

SYNOPSIS

10       #include "tools.h"
11
12
13       void *get_global_static (unsigned int id);
14
15       sg_error sg_global_lock (void);
16
17       sg_error sg_global_unlock (void);
18

DESCRIPTION

20       sg_comp_init() is called by sg_init() to run the initialisation for the
21       globals  component and each registered libstatgrab component. This reg‐
22       istration is done statically by appending  a  component  initialisation
23       information  structure (instance-of sg_comp_info) to the comp_info list
24       in src/libstatgrab/globals.c. The instance of sg_comp_info  is  usually
25       defined by using one of EASY_COMP_SETUP() or EXTENDED_COMP_SETUP(), re‐
26       spectively.
27
28       sg_comp_destroy() is called by sg_shutdown() to destroy all global  re‐
29       sources,  eg.  translation  tables for device names or compiled regular
30       expressions to match path names etc. Statistics resources  are  managed
31       somewhere   else  and  are  freed  (conceptually  and  usually)  before
32       sg_comp_destroy() is invoked.
33
34       sg_comp_get_tls() is the internal function to access the  thread  local
35       storage (formerly static globals) of the component. Usually it's easier
36       to rely on the encapsulating macro GLOBAL_GET_TLS().
37

NOTES

39       Delivering system statistics is the job of  libstatgrab,  managing  the
40       delivery  is  the job of the globals component. To fulfil this job, the
41       components to manage must be prepared:
42
43       1.  declare component's global and TLS data structure (probably only on
44           paper, not in code)
45
46       2.  define  global  initialisation,  thread destruction and process de‐
47           struction functions (if required by 1.)
48
49       3.  define component information structure using *_COMP_SETUP()
50
51       4.  define component accessors using one or more of
52
53           EASY_COMP_ACCESS()
54           EASY_COMP_DIFF()
55           MULTI_COMP_ACCESS()
56           MULTI_COMP_DIFF()
57
58       When having done these steps, a new component delivering new statistics
59       is  born  and  needs to be "announced". Assuming the component is named
60       cpu, append the line { &sg_cpu_init, 0 } to above named comp_info list.
61
62       Component initialisation information in detail:
63
64       typedef sg_error (*comp_global_init_function)(unsigned id);
65       typedef void (*comp_global_destroy_function)(void);
66       typedef void (*comp_global_cleanup_function)(void *);
67
68       struct sg_comp_status {
69               sg_error init_error;
70       };
71
72       struct sg_comp_init {
73               comp_global_init_function init_fn;
74               comp_global_destroy_function destroy_fn;
75               comp_global_cleanup_function cleanup_fn;
76               size_t static_buf_size;
77       #if defined(ENABLE_THREADS) && defined(HAVE_PTHREAD)
78               const char **required_locks;
79       #endif
80               struct sg_comp_status *status;
81       };
82
83
84       Components  which  do  not  need  something   special   can   rely   on
85       EASY_COMP_SETUP():
86
87       Initialising memory component
88
89       EASY_COMP_SETUP(mem,1,NULL);
90
91
92       When own initialisation is needed, doing it is a bit more complex:
93
94       Initialising network component
95
96       #define SG_NETWORK_IO_NOW_IDX 0
97       #define SG_NETWORK_IO_DIFF_IDX     1
98       #define SG_NETWORK_IFACE_IDX  2
99       #define SG_NETWORK_MAX_IDX    3
100
101       EXTENDED_COMP_SETUP(network,SG_NETWORK_MAX_IDX,NULL);
102
103       #ifdef LINUX
104       static regex_t network_io_rx;
105       #define RX_MATCH_COUNT (8+1)
106       #endif
107
108       sg_error
109       sg_network_init_comp(unsigned id) {
110               GLOBAL_SET_ID(network,id);
111
112       #ifdef LINUX
113               if( regcomp( &network_io_rx, ..., REG_EXTENDED)!=0) {
114                       return sg_set_error(SG_ERROR_PARSE, NULL);
115               }
116       #endif
117
118               return SG_ERROR_NONE;
119       }
120
121       void
122       sg_network_destroy_comp(void) {
123       #ifdef LINUX
124               regfree(&network_io_rx);
125       #endif
126       }
127
128       EASY_COMP_CLEANUP_FN(network,SG_NETWORK_MAX_IDX)
129
130
131   MACROS TO WORK WITH THE COMPONENT MANAGER
132       To  simplify working with the component management functions, some pre‐
133       processor macros are available. They are shown here  as  if  they  were
134       functions to ease understanding.
135
136       void DEFAULT_INIT_COMP (identifier comp, ...);
137
138       void EASY_COMP_SETUP (identifier comp, size_t nvect, ...);
139
140       void EXTENDED_COMP_SETUP (identifier comp, size_t nvect, ...);
141
142       void GLOBAL_SET_ID (identifier comp, unsigned int id);
143
144       struct sg_##comp##_glob *GLOBAL_GET_TLS (identifier comp);
145
146       void EASY_COMP_INIT_FN (identifier comp);
147
148       void EASY_COMP_DESTROY_FN (identifier comp);
149
150       void EASY_COMP_CLEANUP_FN (identifier comp, size_t nvect);
151
152       void EASY_COMP_ACCESS (identifier fn, identifier comp, identifier stat,
153                             size_t idx);
154
155       void MULTI_COMP_ACCESS (identifier fn, identifier comp, identifier
156                              stat, size_t idx);
157
158       void EASY_COMP_DIFF (identifier fn, identifier getfn, identifier comp,
159                           identifier stat, size_t diffidx, size_t nowidx);
160
161       void MULTI_COMP_DIFF (identifier fn, identifier getfn, identifier comp,
162                            identifier stat, size_t diffidx, size_t nowidx);
163
164       EASY_COMP_SETUP() cares about anything to be automatically done for in‐
165       stantiating a component information structure for the specified  compo‐
166       nent  comp.   The created TLS storage structure will hold nvect pointer
167       elements and that's it.  All initialisation, destruction  and  cleanup-
168       routines are created as needed using EASY_COMP_INIT_FN(), EASY_COMP_DE‐
169       STROY_FN() and EASY_COMP_CLEANUP_FN(). After  the  amount  of  required
170       vector pointers to be stored the list of required mutexes must be spec‐
171       ified, finished with a NULL pointer.
172
173       EXTENDED_COMP_SETUP() cares about anything to be automatically done for
174       instantiating an component information structure for the specified com‐
175       ponent comp but the required defintion of the initialisation,  destruc‐
176       tion  and cleanup routines. The created TLS storage structure will hold
177       nvect pointer elements and that's it. After the amount of required vec‐
178       tor  pointers to be stored, the list of required mutexes must be speci‐
179       fied, finished with a NULL pointer.  All standard routines can be  cre‐
180       ated   semi-automatically   using   EASY_COMP_INIT_FN(),  EASY_COMP_DE‐
181       STROY_FN() and EASY_COMP_CLEANUP_FN().
182
183       DEFAULT_INIT_COMP() just declares the prototypes  for  the  initialisa‐
184       tion, destruction and cleanup routines, defines the initialisation sta‐
185       tus buffer, lock-names list and finally fills the component initialisa‐
186       tion  structure.  Use this when your TLS storage contains not only vec‐
187       tor pointers.
188
189       GLOBAL_GET_TLS() returns the pointer to the  component's  thread  local
190       storage.
191
192       GLOBAL_SET_ID() stores the component identifier, required eg. to access
193       its TLS.
194
195       EASY_COMP_INIT_FN() defines a default component initialisation routine.
196       It stores the component identifier and returns with SG_ERROR_NONE.
197
198       EASY_COMP_DESTROY_FN()  defines  a default component destructor, called
199       at the end of the entire process (or when  the  last  sg_shutdown()  is
200       called).  The default destructor does nothing and usually an individual
201       initialisation routine requires an individual destructor, too.
202
203       EASY_COMP_CLEANUP_FN() defines a default TLS  cleanup  routine,  always
204       called when a thread ends to free vectors held in thread local storage.
205
206       EASY_COMP_ACCESS() defines accessors to a specific statistic containing
207       one element provided by the  component:  the  functions  fn()  and  the
208       fn##_r().  The following function must exists:
209       sg_error  fn##_int (sg_vector *name##_vect); It accesses the vector idx
210       from TLS of component comp and returns sg_##name##_stats.   It  manages
211       all standard things like memory and error management, return value etc.
212
213       EASY_COMP_DIFF()  returns the difference between the two statistic col‐
214       lection runs. The variant dealing with statgrab owned statistics return
215       the difference between the content currently in the vector specified by
216       nowidx and the resulting vector of getfn(). The result is stored in the
217       vector  diffidx.  If  there  is no current result, simply the result of
218       getfn() is returned.
219
220       MULTI_COMP_ACCESS() defines accessors to a specific statistic  contain‐
221       ing 0..n elements provided by the component: the functions fn() and the
222       fn##_r().  The following function must exists:
223       sg_error fn##_int (sg_vector **name##_vect); It accesses the vector idx
224       from  TLS  of component comp and returns sg_##name##_stats.  It manages
225       all standard things like memory and error anagement, return values, en‐
226       tries update, etc.
227
228       MULTI_COMP_DIFF()  does  the  same  as EASY_COMP_DIFF() but for vectors
229       with more than one element.
230

SEE ALSO

232       libstatgrab(3)  sg_intro(3)  sg_set_error(3)  sg_comp_init(3)   sg_vec‐
233       tor_create(3)
234

WEBSITE

236https://libstatgrab.org/
237
238
239
240libstatgrab                       2019-03-08                   sg_comp_init(3)
Impressum