LCOV - code coverage report
Current view: top level - util/alloc - fd_alloc_ctl.c (source / functions) Hit Total Coverage
Test: cov.lcov Lines: 129 138 93.5 %
Date: 2024-11-13 11:58:15 Functions: 1 1 100.0 %

          Line data    Source code
       1             : #include "../fd_util.h"
       2             : #include "../wksp/fd_wksp_private.h"
       3             : 
       4             : #if FD_HAS_HOSTED
       5             : 
       6             : #include <stdio.h>
       7             : 
       8             : FD_IMPORT_CSTR( fd_alloc_ctl_help, "src/util/alloc/fd_alloc_ctl_help" );
       9             : 
      10             : int
      11             : fd_alloc_fprintf( fd_alloc_t * join,
      12             :                   FILE *       stream );
      13             : 
      14             : int
      15             : main( int     argc,
      16          42 :       char ** argv ) {
      17          42 :   fd_boot( &argc, &argv );
      18         195 : # define SHIFT(n) argv+=(n),argc-=(n)
      19             : 
      20          42 :   if( FD_UNLIKELY( argc<1 ) ) FD_LOG_ERR(( "no arguments" ));
      21          42 :   char const * bin = argv[0];
      22          42 :   SHIFT(1);
      23             : 
      24          42 :   ulong tag = 1UL;
      25             : 
      26          42 :   int cnt = 0;
      27         120 :   while( argc ) {
      28          78 :     char const * cmd = argv[0];
      29          78 :     SHIFT(1);
      30             : 
      31          78 :     if( !strcmp( cmd, "help" ) ) {
      32             : 
      33           3 :       fputs( fd_alloc_ctl_help, stdout );
      34             : 
      35           3 :       FD_LOG_NOTICE(( "%i: %s: success", cnt, cmd ));
      36             : 
      37          75 :     } else if( !strcmp( cmd, "tag" ) ) {
      38             : 
      39           9 :       if( FD_UNLIKELY( argc<1 ) ) FD_LOG_ERR(( "%i: %s: too few arguments\n\tDo %s help for help", cnt, cmd, bin ));
      40             : 
      41           9 :       tag = fd_cstr_to_ulong( argv[0] );
      42             : 
      43           9 :       FD_LOG_NOTICE(( "%i: %s %lu: success", cnt, cmd, tag ));
      44           9 :       SHIFT(1);
      45             : 
      46          66 :     } else if( !strcmp( cmd, "new" ) ) {
      47             : 
      48           6 :       if( FD_UNLIKELY( argc<2 ) ) FD_LOG_ERR(( "%i: %s: too few arguments\n\tDo %s help for help", cnt, cmd, bin ));
      49             : 
      50           6 :       char const * name     =                   argv[0];
      51           6 :       ulong        wksp_tag = fd_cstr_to_ulong( argv[1] );
      52             : 
      53           6 :       ulong align     = fd_alloc_align();
      54           6 :       ulong footprint = fd_alloc_footprint();
      55             : 
      56           6 :       fd_wksp_t * wksp = fd_wksp_attach( name ); /* logs details */
      57           6 :       if( FD_UNLIKELY( !wksp ) ) FD_LOG_ERR(( "%i: %s: fd_wksp_attach( \"%s\" ) failed", cnt, cmd, name ));
      58             : 
      59           6 :       ulong gaddr = fd_wksp_alloc( wksp, align, footprint, wksp_tag );
      60           6 :       if( FD_UNLIKELY( !gaddr ) )
      61           0 :         FD_LOG_ERR(( "%i: %s: fd_wksp_alloc(\"%s\",%lu,%lu,%lu) failed", cnt, cmd, name, align, footprint, wksp_tag ));
      62             : 
      63           6 :       void * shmem = fd_wksp_laddr_fast( wksp, gaddr );
      64           6 :       if( FD_UNLIKELY( !fd_alloc_new( shmem, wksp_tag ) ) ) /* logs details */
      65           0 :         FD_LOG_ERR(( "%i: %s: fd_alloc_new(\"%s\",%lu) failed", cnt, cmd, name, wksp_tag ));
      66             : 
      67           6 :       char cstr[ FD_WKSP_CSTR_MAX ];
      68           6 :       printf( "%s\n", fd_wksp_cstr( wksp, gaddr, cstr ) );
      69             : 
      70           6 :       fd_wksp_detach( wksp ); /* logs details */
      71             : 
      72           6 :       FD_LOG_NOTICE(( "%i: %s %s %lu: success", cnt, cmd, name, wksp_tag ));
      73           6 :       SHIFT(2);
      74             : 
      75          60 :     } else if( !strcmp( cmd, "delete" ) ) {
      76             : 
      77           6 :       if( FD_UNLIKELY( argc<2 ) ) FD_LOG_ERR(( "%i: %s: too few arguments\n\tDo %s help for help", cnt, cmd, bin ));
      78             : 
      79           6 :       char const * cstr            =                 argv[0];
      80           6 :       int          garbage_collect = fd_cstr_to_int( argv[1] );
      81             : 
      82           6 :       void * shalloc = fd_wksp_map( cstr );
      83           6 :       if( FD_UNLIKELY( !shalloc ) ) FD_LOG_ERR(( "%i: %s: fd_wksp_map(\"%s\") failed", cnt, cmd, cstr ));
      84             : 
      85           6 :       fd_alloc_t * alloc = fd_alloc_join( shalloc, 0UL /* d/c */ );
      86           6 :       if( FD_UNLIKELY( !alloc ) ) FD_LOG_ERR(( "%i: %s: fd_alloc_join(\"%s\",0UL) failed", cnt, cmd, cstr ));
      87             : 
      88           6 :       fd_wksp_t * wksp     = fd_alloc_wksp( shalloc );
      89           6 :       ulong       wksp_tag = fd_alloc_tag ( alloc   );
      90             : 
      91           6 :       fd_alloc_delete( fd_alloc_leave( alloc ) ); /* logs details */
      92             : 
      93           6 :       if( garbage_collect ) fd_wksp_tag_free( wksp, &wksp_tag, 1UL ); /* logs details */
      94             : 
      95           6 :       fd_wksp_unmap( shalloc ); /* logs details */
      96             : 
      97           6 :       FD_LOG_NOTICE(( "%i: %s %s %i: success", cnt, cmd, cstr, garbage_collect ));
      98           6 :       SHIFT(2);
      99             : 
     100          54 :     } else if( !strcmp( cmd, "malloc" ) ) {
     101             : 
     102          12 :       if( FD_UNLIKELY( argc<4 ) ) FD_LOG_ERR(( "%i: %s: too few arguments\n\tDo %s help for help", cnt, cmd, bin ));
     103             : 
     104          12 :       char const * cstr       =                   argv[0];
     105          12 :       ulong        cgroup_idx = fd_cstr_to_ulong( argv[1] );
     106          12 :       ulong        align      = fd_cstr_to_ulong( argv[2] );
     107          12 :       ulong        sz         = fd_cstr_to_ulong( argv[3] );
     108             : 
     109          12 :       void * shalloc = fd_wksp_map( cstr );
     110          12 :       if( FD_UNLIKELY( !shalloc ) ) FD_LOG_ERR(( "%i: %s: fd_wksp_map(\"%s\") failed", cnt, cmd, cstr ));
     111             : 
     112          12 :       fd_alloc_t * alloc = fd_alloc_join( shalloc, cgroup_idx );
     113          12 :       if( FD_UNLIKELY( !alloc ) ) FD_LOG_ERR(( "%i: %s: fd_alloc_join(\"%s\",%lu) failed", cnt, cmd, cstr, cgroup_idx ));
     114             : 
     115          12 :       fd_wksp_t * wksp  = fd_alloc_wksp( alloc );
     116          12 :       void *      laddr = fd_alloc_malloc( alloc, align, sz );
     117             : 
     118          12 :       char buf[ FD_WKSP_CSTR_MAX ];
     119          12 :       if(      FD_LIKELY( laddr ) ) printf( "%s\n", fd_wksp_cstr( wksp, fd_wksp_gaddr_fast( wksp, laddr ), buf ) );
     120           3 :       else if( FD_LIKELY( !sz   ) ) printf( "%s\n", fd_wksp_cstr( wksp, 0UL,                               buf ) );
     121           0 :       else                          FD_LOG_ERR(( "%i: %s: fd_alloc_malloc(\"%s\":%lu,%lu,%lu) failed",
     122          12 :                                                  cnt, cmd, cstr, cgroup_idx, align, sz ));
     123             : 
     124          12 :       fd_wksp_unmap( fd_alloc_leave( alloc ) ); /* logs details */
     125             : 
     126          12 :       FD_LOG_NOTICE(( "%i: %s %s %lu %lu %lu: success", cnt, cmd, cstr, cgroup_idx, align, sz ));
     127          12 :       SHIFT(4);
     128             : 
     129          42 :     } else if( !strcmp( cmd, "free" ) ) {
     130             : 
     131          21 :       if( FD_UNLIKELY( argc<3 ) ) FD_LOG_ERR(( "%i: %s: too few arguments\n\tDo %s help for help", cnt, cmd, bin ));
     132             : 
     133          21 :       char const * cstr       =                   argv[0];
     134          21 :       ulong        cgroup_idx = fd_cstr_to_ulong( argv[1] );
     135          21 :       char const * name_gaddr =                   argv[2];
     136             : 
     137          21 :       void * laddr = fd_wksp_map( name_gaddr ); /* logs details */
     138          21 :       if( FD_LIKELY( laddr ) ) {
     139          15 :         void * shalloc = fd_wksp_map( cstr ); /* logs details */
     140          15 :         if( FD_LIKELY( shalloc ) ) {
     141          12 :           fd_alloc_t * alloc = fd_alloc_join( shalloc, cgroup_idx ); /* logs details */
     142          12 :           if( FD_LIKELY( alloc ) ) {
     143          12 :             if( FD_LIKELY( fd_wksp_containing( laddr )==fd_alloc_wksp( alloc ) ) ) fd_alloc_free( alloc, laddr );
     144           0 :             else FD_LOG_WARNING(( "%i: %s: alloc %s was not used for %s", cnt, cmd, cstr, name_gaddr ));
     145          12 :             fd_alloc_leave( alloc ); /* logs details */
     146          12 :           }
     147          12 :           fd_wksp_unmap( shalloc ); /* logs details */
     148          12 :         }
     149          15 :         fd_wksp_unmap( laddr ); /* logs details */
     150          15 :       }
     151             : 
     152          21 :       FD_LOG_NOTICE(( "%i: %s %s %lu %s: success", cnt, cmd, cstr, cgroup_idx, name_gaddr ));
     153          21 :       SHIFT(3);
     154             : 
     155          21 :     } else if( !strcmp( cmd, "compact" ) ) {
     156             : 
     157           3 :       if( FD_UNLIKELY( argc<1 ) ) FD_LOG_ERR(( "%i: %s: too few arguments\n\tDo %s help for help", cnt, cmd, bin ));
     158             : 
     159           3 :       char const * cstr = argv[0];
     160             : 
     161           3 :       void * shalloc = fd_wksp_map( cstr );
     162           3 :       if( FD_UNLIKELY( !shalloc ) ) FD_LOG_ERR(( "%i: %s: fd_wksp_map(\"%s\") failed", cnt, cmd, cstr ));
     163             : 
     164           3 :       fd_alloc_t * alloc = fd_alloc_join( shalloc, 0 /*d/c*/ );
     165           3 :       if( FD_UNLIKELY( !alloc ) ) FD_LOG_ERR(( "%i: %s: fd_alloc_join(\"%s\",0) failed", cnt, cmd, cstr ));
     166             : 
     167           3 :       fd_alloc_compact( alloc ); /* logs details */
     168             : 
     169           3 :       fd_wksp_unmap( fd_alloc_leave( alloc ) ); /* logs details */
     170             : 
     171           3 :       FD_LOG_NOTICE(( "%i: %s %s: success", cnt, cmd, cstr ));
     172           3 :       SHIFT(1);
     173             : 
     174          18 :     } else if( !strcmp( cmd, "query" ) ) {
     175             : 
     176          18 :       if( FD_UNLIKELY( argc<2 ) ) FD_LOG_ERR(( "%i: %s: too few arguments\n\tDo %s help for help", cnt, cmd, bin ));
     177             : 
     178          18 :       char const * what = argv[0];
     179          18 :       char const * cstr = argv[1];
     180             : 
     181          18 :       void *       shmem = NULL;
     182          18 :       fd_alloc_t * alloc = NULL;
     183          18 :       int          err   = -1;
     184             : 
     185          18 :       shmem = fd_wksp_map( cstr );
     186          18 :       if( FD_LIKELY( shmem ) ) {
     187           9 :         alloc = fd_alloc_join( shmem, 0UL /* d/c */ );
     188           9 :         if( FD_LIKELY( alloc ) ) err = 0;
     189           9 :       }
     190             : 
     191          18 :       if(      !strcmp( what, "test" ) ) printf( "%i\n", err );
     192          12 :       else if( !strcmp( what, "tag"  ) ) printf( "%lu\n", FD_UNLIKELY( err ) ? 0UL : fd_alloc_tag( alloc ) );
     193           6 :       else if( !strcmp( what, "leak" ) ) printf( "%i\n",  FD_UNLIKELY( err ) ? -1  : !fd_alloc_is_empty( alloc ) );
     194           0 :       else if( !strcmp( what, "full" ) ) fd_alloc_fprintf( alloc, stdout );
     195           0 :       else                               FD_LOG_ERR(( "unknown query %s", what ));
     196             : 
     197          18 :       if( FD_LIKELY( alloc ) ) fd_alloc_leave( alloc );
     198          18 :       if( FD_LIKELY( shmem ) ) fd_wksp_unmap( shmem );
     199             : 
     200          18 :       FD_LOG_NOTICE(( "%i: %s %s %s: success", cnt, cmd, what, cstr ));
     201          18 :       SHIFT(2);
     202             : 
     203          18 :     } else {
     204             : 
     205           0 :       FD_LOG_ERR(( "%i: %s: unknown command\n\t"
     206           0 :                    "Do %s help for help", cnt, cmd, bin ));
     207             : 
     208           0 :     }
     209          78 :     cnt++;
     210          78 :   }
     211             : 
     212          42 :   if( FD_UNLIKELY( cnt<1 ) ) FD_LOG_NOTICE(( "processed %i commands\n\tDo %s help for help", cnt, bin ));
     213          39 :   else                       FD_LOG_NOTICE(( "processed %i commands", cnt ));
     214             : 
     215          42 : # undef SHIFT
     216          42 :   fd_halt();
     217          42 :   return 0;
     218          42 : }
     219             : 
     220             : #else
     221             : 
     222             : int
     223             : main( int     argc,
     224             :       char ** argv ) {
     225             :   fd_boot( &argc, &argv );
     226             :   if( FD_UNLIKELY( argc<1 ) ) FD_LOG_ERR(( "No arguments" ));
     227             :   if( FD_UNLIKELY( argc>1 ) ) FD_LOG_ERR(( "fd_alloc_ctl not supported on this platform" ));
     228             :   FD_LOG_NOTICE(( "processed 0 commands" ));
     229             :   fd_halt();
     230             :   return 0;
     231             : }
     232             : 
     233             : #endif
     234             : 

Generated by: LCOV version 1.14