cacao  Release 0.1.03-dev
Compute And Control For Adaptive Optics
processtools.h
Go to the documentation of this file.
1 
11 /* =============================================================================================== */
12 /* =============================================================================================== */
13 /* DEFINES, MACROS */
14 /* =============================================================================================== */
15 /* =============================================================================================== */
16 
17 #ifndef _PROCESSTOOLS_H
18 #define _PROCESSTOOLS_H
19 
20 #include <semaphore.h>
21 #include <signal.h>
22 #include <stdint.h>
23 #include <stdio.h>
24 #include <stdlib.h>
25 #include <sys/types.h>
26 #include <unistd.h>
27 
28 #define PROCESSINFOLISTSIZE 10000
29 
30 
31 #define MAXNBSUBPROCESS 50
32 #define MAXNBCPU 100
33 // timing info for real-time loop processes
34 #define PROCESSINFO_NBtimer 100
35 
36 
37 
38 #ifndef __STDC_LIB_EXT1__
39 typedef int errno_t;
40 #endif
41 
42 
43 
44 
45 // --------------------- MANAGING PROCESSES -------------------------------
46 
47 #define STRINGMAXLEN_PROCESSINFO_NAME 80
48 #define STRINGMAXLEN_PROCESSINFO_SRCFUNC 200
49 #define STRINGMAXLEN_PROCESSINFO_SRCFILE 200
50 #define STRINGMAXLEN_PROCESSINFO_TMUXNAME 100
51 #define STRINGMAXLEN_PROCESSINFO_STATUSMSG 200
52 #define STRINGMAXLEN_PROCESSINFO_LOGFILENAME 250
53 #define STRINGMAXLEN_PROCESSINFO_DESCRIPTION 200
54 
65 typedef struct {
67 
68  char source_FUNCTION[STRINGMAXLEN_PROCESSINFO_SRCFUNC];
71 
72  pid_t PID;
73 
74  struct timespec createtime; // time at which pinfo was created
75 
76  long loopcnt; // counter, useful for loop processes to monitor activity
77  long loopcntMax; // exit loop if loopcnt = loopcntMax. Set to -1 for infinite loop
78  int CTRLval; // control value to be externally written.
79  // 0: run (default)
80  // 1: pause
81  // 2: increment single step (will go back to 1)
82  // 3: exit loop
83 
84  char tmuxname[STRINGMAXLEN_PROCESSINFO_TMUXNAME]; // name of tmux session in which process is running, or
85  // "NULL"
86  int loopstat;
87  // 0: INIT Initialization before loop
88  // 1: ACTIVE in loop
89  // 2: PAUSED loop paused (do not iterate)
90  // 3: STOPPED terminated (clean exit following user request to stop process)
91  // 4: ERROR process could not run, typically used when loop can't start, e.g. missing input
92  // 5: SPINNING do not compute (loop iterates, but does not compute. output stream(s) will still be posted/incremented)
93  // 6: CRASHED pid has gone away without proper exit sequence. Will attempt to generate exit log file (using atexit) to identify crash location
94 
95  char statusmsg[STRINGMAXLEN_PROCESSINFO_STATUSMSG]; // status message
96  int statuscode; // status code
97 
98  FILE *logFile;
100 
101  // OPTIONAL TIMING MEASUREMENT
102  // Used to measure how long loop process takes to complete task
103  // Provides means to stop/pause loop process if timing constraints exceeded
104  //
105 
106  int MeasureTiming; // 1 if timing is measured, 0 otherwise
107  int RT_priority; // -1 if unused. 0-99 for higher priority
108 
109  // the last PROCESSINFO_NBtimer times are stored in a circular buffer, from
110  // which timing stats are derived
111  int timerindex; // last written index in circular buffer
112  int timingbuffercnt; // increments every cycle of the circular buffer
113  struct timespec texecstart[PROCESSINFO_NBtimer]; // task starts
114  struct timespec texecend[PROCESSINFO_NBtimer]; // task ends
115 
116  long dtmedian_iter_ns; // median time offset between iterations [nanosec]
117  long dtmedian_exec_ns; // median compute/busy time [nanosec]
118 
119  // If enabled=1, pause process if dtiter larger than limit
123 
124  // If enabled=1, pause process if dtexec larger than limit
128 
130 
131 } PROCESSINFO;
132 
133 
134 
135 
136 //
137 // This structure maintains a list of active processes
138 // It is used to quickly build (without scanning directory) an array of
139 // PROCESSINFO
140 //
141 typedef struct {
142  pid_t PIDarray[PROCESSINFOLISTSIZE];
143  int active[PROCESSINFOLISTSIZE];
144  char pnamearray[PROCESSINFOLISTSIZE][STRINGMAXLEN_PROCESSINFO_NAME]; // short name
145 
147 
148 
149 
150 typedef struct
151 {
152  int active;
153  pid_t PID;
154  char name[40];
155  long updatecnt;
156 
157  long loopcnt;
158  int loopstat;
159 
164 
165  char cpuset[16];
166  char cpusallowed[20];
167  int cpuOKarray[MAXNBCPU];
168  int threads;
169 
171  float memload;
172 
173  char statusmsg[200];
174  char tmuxname[100];
175 
177  int subprocPIDarray[MAXNBSUBPROCESS];
178 
179  double sampletimearray[MAXNBSUBPROCESS]; // time at which sampling was performed [sec]
180  double sampletimearray_prev[MAXNBSUBPROCESS];
181 
182  long ctxtsw_voluntary[MAXNBSUBPROCESS];
183  long ctxtsw_nonvoluntary[MAXNBSUBPROCESS];
184  long ctxtsw_voluntary_prev[MAXNBSUBPROCESS];
185  long ctxtsw_nonvoluntary_prev[MAXNBSUBPROCESS];
186 
187  long long cpuloadcntarray[MAXNBSUBPROCESS];
188  long long cpuloadcntarray_prev[MAXNBSUBPROCESS];
189  float subprocCPUloadarray[MAXNBSUBPROCESS];
190  float subprocCPUloadarray_timeaveraged[MAXNBSUBPROCESS];
191 
192  long VmRSSarray[MAXNBSUBPROCESS];
193 
194  int processorarray[MAXNBSUBPROCESS];
195 
196 
198 
199 
200 
201 
202 
203 typedef struct
204 {
205  int loop; // 1 : loop 0 : exit
206  long loopcnt;
207 
208  int twaitus; // sleep time between scans
209  double dtscan; // measured time interval between scans [s]
210  pid_t scanPID;
211  int scandebugline; // for debugging
212 
213 
214  // ensure list of process and mmap operation blocks display
215  int SCANBLOCK_requested; // scan thread toggles to 1 to requests blocking
216  int SCANBLOCK_OK; // display thread toggles to 1 to let scan know it can proceed
217 
218  PROCESSINFOLIST *pinfolist; // copy of pointer static PROCESSINFOLIST *pinfolist
219 
222 
224 
225 
226  //
227  // these arrays are indexed together
228  // the index is different from the displayed order
229  // new process takes first available free index
230  //
232  int pinfommapped[PROCESSINFOLISTSIZE]; // 1 if mmapped, 0 otherwise
233  pid_t PIDarray[PROCESSINFOLISTSIZE]; // used to track changes
234  int updatearray[PROCESSINFOLISTSIZE]; // 0: don't load, 1: (re)load
235  int fdarray[PROCESSINFOLISTSIZE]; // file descriptors
236  long loopcntarray[PROCESSINFOLISTSIZE];
237  long loopcntoffsetarray[PROCESSINFOLISTSIZE];
238  int selectedarray[PROCESSINFOLISTSIZE];
239 
240  int sorted_pindex_time[PROCESSINFOLISTSIZE];
241 
242 
243  int NBcpus;
245 
246  float CPUload[MAXNBCPU];
247  long long CPUcnt0[MAXNBCPU];
248  long long CPUcnt1[MAXNBCPU];
249  long long CPUcnt2[MAXNBCPU];
250  long long CPUcnt3[MAXNBCPU];
251  long long CPUcnt4[MAXNBCPU];
252  long long CPUcnt5[MAXNBCPU];
253  long long CPUcnt6[MAXNBCPU];
254  long long CPUcnt7[MAXNBCPU];
255  long long CPUcnt8[MAXNBCPU];
256 
257  int CPUids[MAXNBCPU]; // individual cpus (same cores)
258  int CPUphys[MAXNBCPU]; // Physical CPU socket
259 
260  int CPUpcnt[MAXNBCPU];
261 
263  int pindexActive[PROCESSINFOLISTSIZE];
264  int psysinfostatus[PROCESSINFOLISTSIZE];
265 
266 } PROCINFOPROC;
267 
268 
269 
270 
271 
272 // --------------------- -------------------------------
273 
274 typedef struct {
275  char name[200];
276  char description[200];
278 
279 #ifdef __cplusplus
280 extern "C" {
281 #endif
282 
283 
284 
286  char *pinfoname,
287  char descriptionstring[200],
288  char msgstring[200],
289  const char *functionname,
290  const char *filename,
291  int linenumber
292 );
293 
295  PROCESSINFO *processinfo,
296  char *errmsgstring
297 );
298 
300  PROCESSINFO *processinfo
301 );
302 
304  PROCESSINFO *processinfo
305 );
306 
308  PROCESSINFO *processinfo
309 );
310 
311 
312 
313 
314 PROCESSINFO *processinfo_shm_create(const char *pname, int CTRLval);
315 PROCESSINFO *processinfo_shm_link(const char *pname, int *fd);
316 int processinfo_shm_close(PROCESSINFO *pinfo, int fd);
317 int processinfo_cleanExit(PROCESSINFO *processinfo);
318 int processinfo_SIGexit(PROCESSINFO *processinfo, int SignalNumber);
319 int processinfo_WriteMessage(PROCESSINFO *processinfo, const char *msgstring);
320 int processinfo_exec_start(PROCESSINFO *processinfo);
321 int processinfo_exec_end(PROCESSINFO *processinfo);
322 
323 
325 int processinfo_ProcessSignals(PROCESSINFO *processinfo);
326 
327 
329 
330 #ifdef __cplusplus
331 }
332 #endif
333 
334 #endif // _PROCESSTOOLS_H
int processinfo_loopstep(PROCESSINFO *processinfo)
Definition: processtools.c:365
int twaitus
Definition: processtools.h:208
int loop
Definition: processtools.h:205
int loopstat
Definition: processtools.h:158
Definition: processtools.h:141
Definition: processtools.h:274
int DisplayMode
Definition: processtools.h:223
long dtmedian_exec_ns
Definition: processtools.h:117
int RT_priority
Definition: processtools.h:107
long loopcntMax
Definition: processtools.h:77
long NBpinfodisp
Definition: processtools.h:220
int processinfo_ProcessSignals(PROCESSINFO *processinfo)
Definition: processtools.c:1001
float memload
Definition: processtools.h:171
long dtmedian_iter_ns
Definition: processtools.h:116
int loopstat
Definition: processtools.h:86
PROCESSINFODISP * pinfodisp
Definition: processtools.h:221
PROCESSINFOLIST * pinfolist
Definition: processtools.h:218
pid_t PID
source code line
Definition: processtools.h:72
int SCANBLOCK_requested
Definition: processtools.h:215
int createtime_min
Definition: processtools.h:161
int MeasureTiming
Definition: processtools.h:106
int source_LINE
source code file
Definition: processtools.h:70
int processinfo_exec_end(PROCESSINFO *processinfo)
Definition: processtools.c:1128
int NBcpus
Definition: processtools.h:243
int processinfo_SIGexit(PROCESSINFO *processinfo, int SignalNumber)
Definition: processtools.c:754
int processinfo_compute_status(PROCESSINFO *processinfo)
Definition: processtools.c:403
long loopcnt
Definition: processtools.h:206
errno_t processinfo_error(PROCESSINFO *processinfo, char *errmsgstring)
Definition: processtools.c:312
int NBpindexActive
Definition: processtools.h:262
errno_t processinfo_loopstart(PROCESSINFO *processinfo)
Definition: processtools.c:329
int errno_t
Definition: AOloopControl_IOtools.h:20
int createtime_sec
Definition: processtools.h:162
#define STRINGMAXLEN_PROCESSINFO_LOGFILENAME
Definition: processtools.h:52
#define STRINGMAXLEN_PROCESSINFO_NAME
Definition: processtools.h:47
int dtexec_limit_enable
Definition: processtools.h:125
PROCESSINFO * processinfo_shm_link(const char *pname, int *fd)
Definition: processtools.c:687
int createtime_hr
Definition: processtools.h:160
int statuscode
Definition: processtools.h:96
int NBcpusocket
Definition: processtools.h:244
#define MAXNBCPU
Definition: processtools.h:32
#define STRINGMAXLEN_PROCESSINFO_SRCFUNC
Definition: processtools.h:48
int processinfo_exec_start(PROCESSINFO *processinfo)
Definition: processtools.c:1063
#define MAXNBSUBPROCESS
Definition: processtools.h:31
int processinfo_CatchSignals()
Definition: processtools.c:971
int CTRLval
Definition: processtools.h:78
long createtime_ns
Definition: processtools.h:163
PROCESSINFO * processinfo_shm_create(const char *pname, int CTRLval)
Definition: processtools.c:534
double dtscan
Definition: processtools.h:209
int timingbuffercnt
Definition: processtools.h:112
int scandebugline
Definition: processtools.h:211
int rt_priority
Definition: processtools.h:170
errno_t processinfo_CTRLscreen()
Definition: processtools.c:2497
int active
Definition: processtools.h:152
long dtexec_limit_cnt
Definition: processtools.h:127
int SCANBLOCK_OK
Definition: processtools.h:216
#define PROCESSINFOLISTSIZE
Definition: processtools.h:28
Definition: processtools.h:65
int timerindex
Definition: processtools.h:111
int processinfo_cleanExit(PROCESSINFO *processinfo)
Definition: processtools.c:721
int threads
Definition: processtools.h:168
Definition: processtools.h:150
pid_t PID
Definition: processtools.h:153
#define STRINGMAXLEN_PROCESSINFO_STATUSMSG
Definition: processtools.h:51
long dtexec_limit_value
Definition: processtools.h:126
long loopcnt
Definition: processtools.h:157
#define STRINGMAXLEN_PROCESSINFO_TMUXNAME
Definition: processtools.h:50
pid_t scanPID
Definition: processtools.h:210
int processinfo_shm_close(PROCESSINFO *pinfo, int fd)
Definition: processtools.c:708
long dtiter_limit_value
Definition: processtools.h:121
PROCESSINFO * processinfo_setup(char *pinfoname, char descriptionstring[200], char msgstring[200], const char *functionname, const char *filename, int linenumber)
Definition: processtools.c:237
int NBsubprocesses
Definition: processtools.h:176
#define STRINGMAXLEN_PROCESSINFO_DESCRIPTION
Definition: processtools.h:53
Definition: processtools.h:203
#define PROCESSINFO_NBtimer
Definition: processtools.h:34
#define STRINGMAXLEN_PROCESSINFO_SRCFILE
Definition: processtools.h:49
long loopcnt
Definition: processtools.h:76
FILE * logFile
Definition: processtools.h:98
int dtiter_limit_enable
Definition: processtools.h:120
int processinfo_WriteMessage(PROCESSINFO *processinfo, const char *msgstring)
Definition: processtools.c:938
long updatecnt
Definition: processtools.h:155
int errno_t
Definition: processtools.h:39
long dtiter_limit_cnt
Definition: processtools.h:122