LCOV - code coverage report
Current view: top level - flamenco/runtime/sysvar - fd_sysvar_last_restart_slot.c (source / functions) Hit Total Coverage
Test: cov.lcov Lines: 30 42 71.4 %
Date: 2026-05-31 08:07:40 Functions: 4 5 80.0 %

          Line data    Source code
       1             : #include "fd_sysvar_last_restart_slot.h"
       2             : #include "fd_sysvar.h"
       3             : #include "../fd_bank.h"
       4             : #include "../fd_system_ids.h"
       5             : #include "../../accdb/fd_accdb_sync.h"
       6             : #include "fd_sysvar_base.h"
       7             : 
       8             : void
       9             : fd_sysvar_last_restart_slot_write(
      10             :     fd_bank_t *               bank,
      11             :     fd_accdb_user_t *         accdb,
      12             :     fd_funk_txn_xid_t const * xid,
      13             :     fd_capture_ctx_t *        capture_ctx,
      14             :     ulong                     slot
      15          12 : ) {
      16          12 :   uchar enc[ 8 ];
      17          12 :   FD_STORE( ulong, enc, slot );
      18          12 :   fd_sysvar_account_update( bank, accdb, xid, capture_ctx, &fd_sysvar_last_restart_slot_id, enc, sizeof(enc) );
      19          12 : }
      20             : 
      21             : void
      22             : fd_sysvar_last_restart_slot_init( fd_bank_t *               bank,
      23             :                                   fd_accdb_user_t *         accdb,
      24             :                                   fd_funk_txn_xid_t const * xid,
      25           0 :                                   fd_capture_ctx_t *        capture_ctx ) {
      26             : 
      27           0 :   if( !FD_FEATURE_ACTIVE_BANK( bank, last_restart_slot_sysvar ) ) return;
      28             : 
      29           0 :   fd_sysvar_last_restart_slot_write( bank, accdb, xid, capture_ctx, 0UL );
      30           0 : }
      31             : 
      32             : ulong
      33             : fd_sysvar_last_restart_slot_read( fd_accdb_user_t *         accdb,
      34             :                                   fd_funk_txn_xid_t const * xid,
      35          12 :                                   ulong                     sentinel ) {
      36             : 
      37          12 :   fd_accdb_ro_t ro[1];
      38          12 :   if( FD_UNLIKELY( !fd_accdb_open_ro( accdb, ro, xid, &fd_sysvar_last_restart_slot_id ) ) ) {
      39          12 :     return sentinel;
      40          12 :   }
      41             : 
      42           0 :   if( FD_UNLIKELY( fd_accdb_ref_data_sz( ro )!=FD_SYSVAR_LAST_RESTART_SLOT_BINCODE_SZ ) ) {
      43           0 :     fd_accdb_close_ro( accdb, ro );
      44           0 :     return sentinel;
      45           0 :   }
      46             : 
      47           0 :   ulong result = FD_LOAD( ulong, fd_accdb_ref_data_const( ro ) );
      48           0 :   fd_accdb_close_ro( accdb, ro );
      49           0 :   return result;
      50           0 : }
      51             : 
      52             : /* fd_sysvar_last_restart_slot_update is equivalent to
      53             :    Agave's solana_runtime::bank::Bank::update_last_restart_slot */
      54             : 
      55             : ulong
      56          27 : fd_sysvar_last_restart_slot_derive( fd_bank_t const * bank ) {
      57          27 :   ulong slot = bank->f.slot;
      58          27 :   ulong last_restart_slot = 0UL;
      59             : 
      60          63 :   for( ulong i=0UL; i<bank->f.hard_fork_cnt; i++ ) {
      61          36 :     ulong hard_fork_slot = bank->f.hard_forks[ i ].slot;
      62          36 :     if( hard_fork_slot<=slot && hard_fork_slot>last_restart_slot ) {
      63          24 :       last_restart_slot = hard_fork_slot;
      64          24 :     }
      65          36 :   }
      66             : 
      67          27 :   return last_restart_slot;
      68          27 : }
      69             : 
      70             : void
      71             : fd_sysvar_last_restart_slot_update( fd_bank_t *               bank,
      72             :                                     fd_accdb_user_t *         accdb,
      73             :                                     fd_funk_txn_xid_t const * xid,
      74        3549 :                                     fd_capture_ctx_t *        capture_ctx ) {
      75             : 
      76             :   /* https://github.com/solana-labs/solana/blob/v1.18.18/runtime/src/bank.rs#L2093-L2095 */
      77        3549 :   if( !FD_FEATURE_ACTIVE_BANK( bank, last_restart_slot_sysvar ) ) return;
      78             : 
      79          12 :   ulong last_restart_slot_want = fd_sysvar_last_restart_slot_derive( bank );
      80          12 :   bank->f.last_restart_slot = last_restart_slot_want;
      81             : 
      82             :   /* https://github.com/solana-labs/solana/blob/v1.18.18/runtime/src/bank.rs#L2098-L2106 */
      83          12 :   ulong last_restart_slot_have = fd_sysvar_last_restart_slot_read( accdb, xid, ULONG_MAX );
      84             : 
      85             :   /* https://github.com/solana-labs/solana/blob/v1.18.18/runtime/src/bank.rs#L2122-L2130 */
      86          12 :   if( last_restart_slot_have!=last_restart_slot_want ) {
      87          12 :     fd_sysvar_last_restart_slot_write( bank, accdb, xid, capture_ctx, last_restart_slot_want );
      88          12 :   }
      89          12 : }

Generated by: LCOV version 1.14