LCOV - code coverage report
Current view: top level - ballet/reedsol - fd_reedsol.c (source / functions) Hit Total Coverage
Test: cov.lcov Lines: 29 49 59.2 %
Date: 2026-10-15 04:28:26 Functions: 2 3 66.7 %

          Line data    Source code
       1             : #include "fd_reedsol_private.h"
       2             : #include "../../util/sanitize/fd_msan.h"
       3             : 
       4             : /* Include the constants in one central spot */
       5             : 
       6             : #if FD_REEDSOL_ARITH_IMPL==0
       7             : FD_IMPORT_BINARY( fd_reedsol_arith_consts_generic_mul, "src/ballet/reedsol/constants/generic_constants.bin" );
       8             : #elif FD_REEDSOL_ARITH_IMPL==1
       9             : FD_IMPORT_BINARY( fd_reedsol_arith_consts_avx_mul, "src/ballet/reedsol/constants/avx2_constants.bin" );
      10             : #elif FD_REEDSOL_ARITH_IMPL==4
      11             : FD_IMPORT_BINARY( fd_reedsol_arith_consts_neon_mul, "src/ballet/reedsol/constants/neon_constants.bin" );
      12             : #else
      13             : FD_IMPORT_BINARY( fd_reedsol_arith_consts_gfni_mul, "src/ballet/reedsol/constants/gfni_constants.bin" );
      14             : #endif
      15             : 
      16             : void
      17      187437 : fd_reedsol_encode_fini( fd_reedsol_t * rs ) {
      18             : 
      19       62479 : # if FD_REEDSOL_ARITH_IMPL==3
      20       62479 :   if( FD_LIKELY( (rs->data_shred_cnt==32UL) & (rs->parity_shred_cnt==32UL ) ) ) {
      21       62479 :     fd_reedsol_private_encode_32_32( rs->shred_sz, rs->encode.data_shred, rs->encode.parity_shred, rs->scratch );
      22     2061807 :     for( ulong i=0UL; i<rs->parity_shred_cnt; i++ ) fd_msan_unpoison( rs->encode.parity_shred[ i ], rs->shred_sz );
      23       62479 :   } else
      24           0 : # endif
      25      124958 :   if( FD_UNLIKELY( rs->data_shred_cnt<=16UL ) )
      26           0 :     fd_reedsol_private_encode_16 ( rs->shred_sz, rs->encode.data_shred, rs->data_shred_cnt, rs->encode.parity_shred, rs->parity_shred_cnt );
      27      124958 :   else if( FD_LIKELY( rs->data_shred_cnt<=32UL ) )
      28      124958 :     fd_reedsol_private_encode_32 ( rs->shred_sz, rs->encode.data_shred, rs->data_shred_cnt, rs->encode.parity_shred, rs->parity_shred_cnt );
      29           0 :   else if( FD_LIKELY( rs->data_shred_cnt<=64UL ) )
      30           0 :     fd_reedsol_private_encode_64 ( rs->shred_sz, rs->encode.data_shred, rs->data_shred_cnt, rs->encode.parity_shred, rs->parity_shred_cnt );
      31           0 :   else
      32           0 :       fd_reedsol_private_encode_128( rs->shred_sz, rs->encode.data_shred, rs->data_shred_cnt, rs->encode.parity_shred, rs->parity_shred_cnt );
      33             : 
      34      187437 :   rs->data_shred_cnt   = 0UL;
      35      187437 :   rs->parity_shred_cnt = 0UL;
      36      187437 : }
      37             : 
      38             : int
      39         219 : fd_reedsol_recover_fini( fd_reedsol_t * rs ) {
      40             : 
      41         219 :   ulong data_shred_cnt   = rs->data_shred_cnt;
      42         219 :   ulong parity_shred_cnt = rs->parity_shred_cnt;
      43             : 
      44         219 :   rs->data_shred_cnt   = 0UL;
      45         219 :   rs->parity_shred_cnt = 0UL;
      46             : 
      47             :   /* How many shreds do we need to consider in order to find
      48             :      rs->data_shred_cnt un-erased? */
      49             : 
      50         219 :   ulong unerased = 0UL;
      51         219 :   ulong i        = 0UL;
      52       12207 :   for( ; i<data_shred_cnt + parity_shred_cnt; i++ ) {
      53       12207 :     unerased += !rs->recover.erased[ i ];
      54       12207 :     if( unerased==data_shred_cnt ) break;
      55       12207 :   }
      56         219 :   if( FD_UNLIKELY( unerased!=data_shred_cnt ) ) return FD_REEDSOL_ERR_PARTIAL;
      57             : 
      58             : # if 0 /* TODO: Add first variant for slightly more performance */
      59             :   if( FD_LIKELY( i==data_shred_cnt ) ) {
      60             :     // Common case: we have all of the data shreds
      61             :     if( FD_UNLIKELY( i<=16UL ) )
      62             :       return fd_reedsol_private_recover_first_16( rs->shred_sz, rs->recover.shred, data_shred_cnt, parity_shred_cnt );
      63             :     if( FD_LIKELY( i<=32UL ) )
      64             :       return fd_reedsol_private_recover_first_32( rs->shred_sz, rs->recover.shred, data_shred_cnt, parity_shred_cnt );
      65             :     if( FD_LIKELY( i<=64UL ) )
      66             :       return fd_reedsol_private_recover_first_64( rs->shred_sz, rs->recover.shred, data_shred_cnt, parity_shred_cnt );
      67             :     return fd_reedsol_private_recover_first_128(  rs->shred_sz, rs->recover.shred, data_shred_cnt, parity_shred_cnt );
      68             :   }
      69             : # endif
      70             : 
      71         219 :   if( FD_UNLIKELY( i<16UL ) )
      72           0 :     return fd_reedsol_private_recover_var_16( rs->shred_sz, rs->recover.shred, data_shred_cnt, parity_shred_cnt, rs->recover.erased );
      73         219 :   if( FD_LIKELY(   i<32UL ) )
      74          39 :     return fd_reedsol_private_recover_var_32( rs->shred_sz, rs->recover.shred, data_shred_cnt, parity_shred_cnt, rs->recover.erased );
      75         180 :   if( FD_LIKELY(   i<64UL ) )
      76         180 :     return fd_reedsol_private_recover_var_64( rs->shred_sz, rs->recover.shred, data_shred_cnt, parity_shred_cnt, rs->recover.erased );
      77           0 :   if( FD_LIKELY(   i<128UL ) )
      78           0 :     return fd_reedsol_private_recover_var_128( rs->shred_sz, rs->recover.shred, data_shred_cnt, parity_shred_cnt, rs->recover.erased );
      79             : 
      80           0 :   return fd_reedsol_private_recover_var_256( rs->shred_sz, rs->recover.shred, data_shred_cnt, parity_shred_cnt, rs->recover.erased );
      81           0 : }
      82             : 
      83             : char const *
      84           0 : fd_reedsol_strerror( int err ) {
      85           0 :   switch( err ) {
      86           0 :   case FD_REEDSOL_SUCCESS:     return "success";
      87           0 :   case FD_REEDSOL_ERR_CORRUPT: return "corrupt";
      88           0 :   case FD_REEDSOL_ERR_PARTIAL: return "partial";
      89           0 :   default: break;
      90           0 :   }
      91           0 :   return "unknown";
      92           0 : }

Generated by: LCOV version 1.14