Line data Source code
1 : #include "helper.h"
2 : #include "../../../platform/fd_sys_util.h"
3 : #include "../../../../tango/cnc/fd_cnc.h"
4 : #include <sys/time.h>
5 : #include <sys/select.h>
6 : #include <stdio.h>
7 : #include <errno.h>
8 : #include <unistd.h>
9 :
10 0 : #define PRINT( ... ) do { \
11 0 : int n = snprintf( *buf, *buf_sz, __VA_ARGS__ ); \
12 0 : if( FD_UNLIKELY( n<0 ) ) FD_LOG_ERR(( "snprintf failed" )); \
13 0 : if( FD_UNLIKELY( (ulong)n>=*buf_sz ) ) FD_LOG_ERR(( "snprintf truncated" )); \
14 0 : *buf += n; *buf_sz -= (ulong)n; \
15 0 : } while(0)
16 :
17 : void
18 : printf_age( char ** buf,
19 : ulong * buf_sz,
20 0 : long _dt ) {
21 0 : if( FD_UNLIKELY( _dt< 0L ) ) { PRINT( " invalid" ); return; }
22 0 : if( FD_UNLIKELY( _dt==0L ) ) { PRINT( " 0s" ); return; }
23 0 : ulong rem = (ulong)_dt;
24 0 : ulong ns = rem % 1000UL; rem /= 1000UL; if( !rem /*no u*/ ) { PRINT( " %3lun", ns ); return; }
25 0 : ulong us = rem % 1000UL; rem /= 1000UL; if( !rem /*no m*/ ) { PRINT( " %3lu.%03luu", us, ns ); return; }
26 0 : ulong ms = rem % 1000UL; rem /= 1000UL; if( !rem /*no s*/ ) { PRINT( "%3lu.%03lu%02lum", ms, us, ns/10UL ); return; }
27 0 : ulong s = rem % 60UL; rem /= 60UL; if( !rem /*no m*/ ) { PRINT( "%2lu.%03lu%03lus", s, ms, us ); return; }
28 0 : ulong m = rem % 60UL; rem /= 60UL; if( !rem /*no h*/ ) { PRINT( "%2lu:%02lu.%03lu%1lu", m, s, ms, us/100UL ); return; }
29 0 : ulong h = rem % 24UL; rem /= 24UL; if( !rem /*no d*/ ) { PRINT( "%2lu:%02lu:%02lu.%1lu", h, m, s, ms/100UL ); return; }
30 0 : ulong d = rem % 7UL; rem /= 7UL; if( !rem /*no w*/ ) { PRINT( " %1lud %2lu:%02lu", d, h, m ); return; }
31 0 : ulong w = rem; if( w<=99UL ) { PRINT( "%2luw %1lud %2luh", w, d, h ); return; }
32 0 : /* note that this can handle LONG_MAX fine */ PRINT( "%6luw %1lud", w, d );
33 0 : }
34 :
35 : void
36 : printf_stale( char ** buf,
37 : ulong * buf_sz,
38 : long age,
39 0 : long expire ) {
40 0 : if( FD_UNLIKELY( age>expire ) ) {
41 0 : PRINT( TEXT_YELLOW );
42 0 : printf_age( buf, buf_sz, age );
43 0 : PRINT( TEXT_NORMAL );
44 0 : return;
45 0 : }
46 0 : PRINT( TEXT_GREEN " -" TEXT_NORMAL );
47 0 : }
48 :
49 : void
50 : printf_heart( char ** buf,
51 : ulong * buf_sz,
52 : long hb_now,
53 0 : long hb_then ) {
54 0 : long dt = hb_now - hb_then;
55 0 : PRINT( "%s", (dt>0L) ? (TEXT_GREEN " -" TEXT_NORMAL) :
56 0 : (!dt) ? (TEXT_RED " NONE" TEXT_NORMAL) :
57 0 : (TEXT_BLUE "RESET" TEXT_NORMAL) );
58 0 : }
59 :
60 : char const *
61 0 : sig_color( ulong sig ) {
62 0 : switch( sig ) {
63 0 : case FD_CNC_SIGNAL_BOOT: return TEXT_BLUE; /* Blue -> waiting for tile to start */
64 0 : case FD_CNC_SIGNAL_HALT: return TEXT_YELLOW; /* Yellow -> waiting for tile to process */
65 0 : case FD_CNC_SIGNAL_RUN: return TEXT_GREEN; /* Green -> Normal */
66 0 : case FD_CNC_SIGNAL_FAIL: return TEXT_RED; /* Red -> Definitely abnormal */
67 0 : default: break; /* Unknown, don't colorize */
68 0 : }
69 0 : return TEXT_NORMAL;
70 0 : }
71 :
72 : void
73 : printf_sig( char ** buf,
74 : ulong * buf_sz,
75 : ulong sig_now,
76 0 : ulong sig_then ) {
77 0 : char buf0[ FD_CNC_SIGNAL_CSTR_BUF_MAX ];
78 0 : char buf1[ FD_CNC_SIGNAL_CSTR_BUF_MAX ];
79 0 : PRINT( "%s%4s" TEXT_NORMAL "(%s%4s" TEXT_NORMAL ")",
80 0 : sig_color( sig_now ), fd_cnc_signal_cstr( sig_now, buf0 ),
81 0 : sig_color( sig_then ), fd_cnc_signal_cstr( sig_then, buf1 ) );
82 0 : }
83 :
84 : void
85 : printf_err_bool( char ** buf,
86 : ulong * buf_sz,
87 : ulong err_now,
88 0 : ulong err_then ) {
89 0 : PRINT( "%5s(%5s)", err_now ? TEXT_RED "err" TEXT_NORMAL : TEXT_GREEN " -" TEXT_NORMAL,
90 0 : err_then ? TEXT_RED "err" TEXT_NORMAL : TEXT_GREEN " -" TEXT_NORMAL );
91 0 : }
92 :
93 : void
94 : printf_err_cnt( char ** buf,
95 : ulong * buf_sz,
96 : ulong cnt_now,
97 0 : ulong cnt_then ) {
98 0 : long delta = (long)(cnt_now - cnt_then);
99 0 : char const * color = (!delta) ? TEXT_GREEN /* no new error counts */
100 0 : : (delta>0L) ? TEXT_RED /* new error counts */
101 0 : : (cnt_now) ? TEXT_YELLOW /* decrease of existing error counts?? */
102 0 : : TEXT_BLUE; /* reset of the error counter */
103 0 : if( delta> 99999L ) PRINT( "%10u(%s>+99999" TEXT_NORMAL ")", (uint)cnt_now, color );
104 0 : else if( delta<-99999L ) PRINT( "%10u(%s<-99999" TEXT_NORMAL ")", (uint)cnt_now, color );
105 0 : else PRINT( "%10u(%s %+6li" TEXT_NORMAL ")", (uint)cnt_now, color, delta );
106 0 : }
107 :
108 : void
109 : printf_seq( char ** buf,
110 : ulong * buf_sz,
111 : ulong seq_now,
112 0 : ulong seq_then ) {
113 0 : long delta = (long)(seq_now - seq_then);
114 0 : char const * color = (!delta) ? TEXT_YELLOW /* no sequence numbers published */
115 0 : : (delta>0L) ? TEXT_GREEN /* new sequence numbers published */
116 0 : : (seq_now) ? TEXT_RED /* sequence number went backward */
117 0 : : TEXT_BLUE; /* sequence number reset */
118 0 : if( delta> 99999L ) PRINT( "%10lu(%s>+99999" TEXT_NORMAL ")", seq_now, color );
119 0 : else if( delta<-99999L ) PRINT( "%10lu(%s<-99999" TEXT_NORMAL ")", seq_now, color );
120 0 : else PRINT( "%10lu(%s %+6li" TEXT_NORMAL ")", seq_now, color, delta );
121 0 : }
122 :
123 : void
124 : printf_rate( char ** buf,
125 : ulong * buf_sz,
126 : double cvt,
127 : double overhead,
128 : ulong cnt_now,
129 : ulong cnt_then,
130 0 : long dt ) {
131 0 : if( FD_UNLIKELY( !((0.< cvt ) & (cvt<=DBL_MAX)) |
132 0 : !((0.<=overhead) & (cvt<=DBL_MAX)) |
133 0 : (cnt_now<cnt_then) |
134 0 : (dt<=0L) ) ) {
135 0 : PRINT( TEXT_RED " invalid" TEXT_NORMAL );
136 0 : return;
137 0 : }
138 0 : double rate = cvt*(overhead+(double)(cnt_now-cnt_then)) / (double)dt;
139 0 : if( FD_UNLIKELY( !((0.<=rate) & (rate<=DBL_MAX)) ) ) {
140 0 : PRINT( TEXT_RED "overflow" TEXT_NORMAL );
141 0 : return;
142 0 : }
143 0 : /**/ if( rate<=9999.9 ) { PRINT( " %6.1f ", rate ); return; }
144 0 : rate *= 1e-3; if( rate<=9999.9 ) { PRINT( " %6.1fK", rate ); return; }
145 0 : rate *= 1e-3; if( rate<=9999.9 ) { PRINT( " %6.1fM", rate ); return; }
146 0 : rate *= 1e-3; if( rate<=9999.9 ) { PRINT( " %6.1fG", rate ); return; }
147 0 : rate *= 1e-3; if( rate<=9999.9 ) { PRINT( " %6.1fT", rate ); return; }
148 0 : rate *= 1e-3; if( rate<=9999.9 ) { PRINT( " %6.1fP", rate ); return; }
149 0 : rate *= 1e-3; if( rate<=9999.9 ) { PRINT( " %6.1fE", rate ); return; }
150 0 : rate *= 1e-3; if( rate<=9999.9 ) { PRINT( " %6.1fZ", rate ); return; }
151 0 : rate *= 1e-3; if( rate<=9999.9 ) { PRINT( " %6.1fY", rate ); return; }
152 0 : /**/ PRINT( ">9999.9Y" );
153 0 : }
154 :
155 : void
156 : printf_pct( char ** buf,
157 : ulong * buf_sz,
158 : ulong num_now,
159 : ulong num_then,
160 : double lhopital_num,
161 : ulong den_now,
162 : ulong den_then,
163 0 : double lhopital_den ) {
164 0 : if( FD_UNLIKELY( (num_now<num_then) |
165 0 : (den_now<den_then) |
166 0 : !((0.<=lhopital_num) & (lhopital_num<=DBL_MAX)) |
167 0 : !((0.< lhopital_den) & (lhopital_den<=DBL_MAX)) ) ) {
168 0 : PRINT( TEXT_RED " invalid" TEXT_NORMAL );
169 0 : return;
170 0 : }
171 :
172 0 : double pct = 100.*(((double)(num_now - num_then) + lhopital_num) / ((double)(den_now - den_then) + lhopital_den));
173 :
174 0 : if( FD_UNLIKELY( !((0.<=pct) & (pct<=DBL_MAX)) ) ) {
175 0 : PRINT( TEXT_RED "overflow" TEXT_NORMAL );
176 0 : return;
177 0 : }
178 :
179 0 : if( pct<=999.999 ) { PRINT( " %7.3f", pct ); return; }
180 0 : /**/ PRINT( ">999.999" );
181 0 : }
182 :
183 : int
184 0 : fd_getchar( void ) {
185 :
186 0 : fd_set read_fds;
187 0 : FD_ZERO( &read_fds );
188 0 : FD_SET( STDIN_FILENO, &read_fds );
189 0 : fd_set except_fds = read_fds;
190 :
191 0 : struct timeval timeout;
192 0 : timeout.tv_sec = 0;
193 0 : timeout.tv_usec = 0;
194 :
195 0 : if( FD_UNLIKELY( -1==select( 1, &read_fds, NULL, &except_fds, &timeout ) ) ) {
196 0 : FD_LOG_ERR(( "select(STDIN_FILENO) failed (%i-%s)", errno, fd_io_strerror( errno ) ));
197 0 : }
198 :
199 0 : int ch = 0;
200 0 : if( FD_UNLIKELY( FD_ISSET( STDIN_FILENO, &read_fds ) || FD_ISSET( STDIN_FILENO, &except_fds ) ) ) {
201 0 : long read_ret = read( STDIN_FILENO, &ch, 1 );
202 0 : if( FD_UNLIKELY( read_ret<0 ) ) {
203 0 : FD_LOG_ERR(( "read(STDIN_FILENO) failed (%i-%s)", errno, fd_io_strerror( errno ) ));
204 0 : } else if( FD_UNLIKELY( !read_ret ) ) {
205 0 : fd_sys_util_exit_group( 0 );
206 0 : }
207 0 : }
208 :
209 0 : return (int)ch;
210 0 : }
|