LCOV - code coverage report
Current view: top level - app/shared/commands/monitor - helper.c (source / functions) Hit Total Coverage
Test: cov.lcov Lines: 0 138 0.0 %
Date: 2025-08-05 05:04:49 Functions: 0 11 0.0 %

          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 : }

Generated by: LCOV version 1.14