LCOV - code coverage report
Current view: top level - vinyl/rq - fd_vinyl_rq.c (source / functions) Hit Total Coverage
Test: cov.lcov Lines: 74 74 100.0 %
Date: 2025-12-07 04:58:33 Functions: 6 6 100.0 %

          Line data    Source code
       1             : #include "fd_vinyl_rq.h"
       2             : 
       3             : ulong
       4          30 : fd_vinyl_rq_align( void ) {
       5          30 :   return alignof(fd_vinyl_rq_t);
       6          30 : }
       7             : 
       8             : ulong
       9          18 : fd_vinyl_rq_footprint( ulong req_cnt ) {
      10          18 :   if( FD_UNLIKELY( !((4UL<=req_cnt) & (req_cnt<(1UL<<63)/sizeof(fd_vinyl_req_t)) & fd_ulong_is_pow2( req_cnt )) ) ) return 0UL;
      11           6 :   return fd_ulong_align_up( sizeof(fd_vinyl_rq_t) + req_cnt*sizeof(fd_vinyl_req_t), alignof(fd_vinyl_rq_t) );
      12          18 : }
      13             : 
      14             : void *
      15             : fd_vinyl_rq_new( void * shmem,
      16          12 :                  ulong  req_cnt ) {
      17          12 :   fd_vinyl_rq_t * rq = (fd_vinyl_rq_t *)shmem;
      18             : 
      19          12 :   if( FD_UNLIKELY( !rq ) ) {
      20           3 :     FD_LOG_WARNING(( "NULL shmem"));
      21           3 :     return NULL;
      22           3 :   }
      23             : 
      24           9 :   if( FD_UNLIKELY( !fd_ulong_is_aligned( (ulong)rq, fd_vinyl_rq_align() ) ) ) {
      25           3 :     FD_LOG_WARNING(( "bad align"));
      26           3 :     return NULL;
      27           3 :   }
      28             : 
      29           6 :   ulong footprint = fd_vinyl_rq_footprint( req_cnt );
      30           6 :   if( FD_UNLIKELY( !footprint) ) {
      31           3 :     FD_LOG_WARNING(( "bad req_cnt"));
      32           3 :     return NULL;
      33           3 :   }
      34             : 
      35           3 :   memset( rq, 0, footprint );
      36             : 
      37           3 :   rq->req_cnt = req_cnt;
      38           3 :   rq->seq     = 0UL;
      39             : 
      40           3 :   fd_vinyl_req_t * req = fd_vinyl_rq_req( rq );
      41             : 
      42       24579 :   for( ulong seq=0UL; seq<req_cnt; seq++ ) req[ seq ].seq = seq - 1UL; /* Just before the next seq to be written to this entry */
      43             : 
      44           3 :   FD_COMPILER_MFENCE();
      45           3 :   rq->magic = FD_VINYL_RQ_MAGIC;
      46           3 :   FD_COMPILER_MFENCE();
      47             : 
      48           3 :   return rq;
      49           6 : }
      50             : 
      51             : fd_vinyl_rq_t *
      52          12 : fd_vinyl_rq_join( void * shrq ) {
      53          12 :   fd_vinyl_rq_t * rq = (fd_vinyl_rq_t *)shrq;
      54             : 
      55          12 :   if( FD_UNLIKELY( !rq ) ) {
      56           3 :     FD_LOG_WARNING(( "NULL shrq"));
      57           3 :     return NULL;
      58           3 :   }
      59             : 
      60           9 :   if( FD_UNLIKELY( !fd_ulong_is_aligned( (ulong)rq, fd_vinyl_rq_align() ) ) ) {
      61           3 :     FD_LOG_WARNING(( "bad align"));
      62           3 :     return NULL;
      63           3 :   }
      64             : 
      65           6 :   if( FD_UNLIKELY( rq->magic!=FD_VINYL_RQ_MAGIC ) ) {
      66           3 :     FD_LOG_WARNING(( "bad magic"));
      67           3 :     return NULL;
      68           3 :   }
      69             : 
      70           3 :   return (fd_vinyl_rq_t *)shrq;
      71           6 : }
      72             : 
      73             : void *
      74           6 : fd_vinyl_rq_leave( fd_vinyl_rq_t * rq ) {
      75             : 
      76           6 :   if( FD_UNLIKELY( !rq ) ) {
      77           3 :     FD_LOG_WARNING(( "NULL rq"));
      78           3 :     return NULL;
      79           3 :   }
      80             : 
      81           3 :   return rq;
      82           6 : }
      83             : 
      84             : void *
      85          12 : fd_vinyl_rq_delete( void * shrq ) {
      86          12 :   fd_vinyl_rq_t * rq = (fd_vinyl_rq_t *)shrq;
      87             : 
      88          12 :   if( FD_UNLIKELY( !rq ) ) {
      89           3 :     FD_LOG_WARNING(( "NULL shrq"));
      90           3 :     return NULL;
      91           3 :   }
      92             : 
      93           9 :   if( FD_UNLIKELY( !fd_ulong_is_aligned( (ulong)rq, fd_vinyl_rq_align() ) ) ) {
      94           3 :     FD_LOG_WARNING(( "bad align"));
      95           3 :     return NULL;
      96           3 :   }
      97             : 
      98           6 :   if( FD_UNLIKELY( rq->magic!=FD_VINYL_RQ_MAGIC ) ) {
      99           3 :     FD_LOG_WARNING(( "bad magic"));
     100           3 :     return NULL;
     101           3 :   }
     102             : 
     103           3 :   FD_COMPILER_MFENCE();
     104           3 :   rq->magic = 0UL;
     105           3 :   FD_COMPILER_MFENCE();
     106             : 
     107           3 :   return rq;
     108           6 : }

Generated by: LCOV version 1.14