LCOV - code coverage report
Current view: top level - flamenco/features - fd_features.h (source / functions) Hit Total Coverage
Test: cov.lcov Lines: 19 24 79.2 %
Date: 2025-12-05 04:49:52 Functions: 9 750 1.2 %

          Line data    Source code
       1             : #ifndef HEADER_fd_src_flamenco_features_fd_features_h
       2             : #define HEADER_fd_src_flamenco_features_fd_features_h
       3             : 
       4             : #include "../fd_flamenco_base.h"
       5             : #include "../types/fd_types.h"
       6             : #include "fd_features_generated.h"
       7             : #include "../../funk/fd_funk_base.h"
       8             : 
       9             : /* Macro FEATURE_ID_CNT expands to the number of features in
      10             :    fd_features_t. */
      11             : 
      12             : //#define FD_FEATURE_ID_CNT (... see generated.h ...)
      13             : 
      14             : /* FD_FEATURE_DISABLED is the sentinel value of the feature activation
      15             :    slot when the feature has not yet been activated. */
      16             : 
      17     1909341 : #define FD_FEATURE_DISABLED (ULONG_MAX)
      18             : 
      19             : /* Convenience macros for checking features */
      20             : 
      21       16365 : #define FD_FEATURE_ACTIVE_(_slot, _features, _feature_name)               ( _slot >= (_features)-> _feature_name )
      22             : #define FD_FEATURE_JUST_ACTIVATED_(_slot, _features, _feature_name)       ( _slot == (_features)-> _feature_name )
      23           0 : #define FD_FEATURE_ACTIVE_OFFSET_(_slot, _features, _offset)              ( _slot >= (_features)->f[_offset>>3] )
      24           0 : #define FD_FEATURE_JUST_ACTIVATED_OFFSET_(_slot, _features, _offset)      ( _slot == (_features)->f[_offset>>3] )
      25             : 
      26             : #define FD_FEATURE_SET_ACTIVE(_features, _feature_name, _slot)            ( (_features)-> _feature_name = _slot )
      27           0 : #define FD_FEATURE_ACTIVE_OFFSET(_slot, _features, _offset)               FD_FEATURE_ACTIVE_OFFSET_( _slot, _features, _offset )
      28           0 : #define FD_FEATURE_JUST_ACTIVATED_OFFSET(_bank, _offset)                  FD_FEATURE_JUST_ACTIVATED_OFFSET_( fd_bank_slot_get( _bank ), fd_bank_features_query( _bank ), _offset )
      29         675 : #define FD_FEATURE_ACTIVE(_slot, _features, _feature_name)                FD_FEATURE_ACTIVE_( _slot, _features, _feature_name )
      30       15690 : #define FD_FEATURE_ACTIVE_BANK(_bank, _feature_name)                      FD_FEATURE_ACTIVE_( fd_bank_slot_get( _bank ), fd_bank_features_query( _bank ), _feature_name )
      31           0 : #define FD_FEATURE_ACTIVE_BANK_OFFSET(_bank, _offset)                     FD_FEATURE_ACTIVE_OFFSET_( fd_bank_slot_get( _bank ), fd_bank_features_query( _bank ), _offset )
      32             : 
      33             : 
      34             : /* fd_features_t is the current set of enabled feature flags.
      35             : 
      36             :    Each feature has a corresponding account in the account database,
      37             :    which are used to control activation.  This structure contains an
      38             :    ulong of the activation slots of each feature for convenience (or
      39             :    FD_FEATURE_DISABLED if not yet activated).  The feature params
      40             :    contained in this structure change over time, as activated features
      41             :    become default, and as new pending feature activations get added.
      42             : 
      43             :    Usage:
      44             : 
      45             :      fd_features_t * features;
      46             : 
      47             :      // Direct API
      48             :      ulong activation_slot = features->FEATURE_NAME;
      49             : 
      50             :      // Indirect API
      51             :      fd_feature_id_t const * id;
      52             :      ulong activation_slot = fd_features_get( id );
      53             :      ... id->index safe in [0,FD_FEATURE_CNT) ... */
      54             : 
      55             : typedef union fd_features fd_features_t;
      56             : 
      57             : /* fd_feature_id_t maps a feature ID (account address) to the byte
      58             :    offset in fd_features_t. */
      59             : 
      60             : struct fd_feature_id {
      61             :   ulong        index;                /* index of feature in fd_features_t */
      62             :   fd_pubkey_t  id;                   /* pubkey of feature */
      63             :   char const * name;                 /* feature name cstr */
      64             :   uint         cleaned_up[3];        /* cleaned_up cluster version for feature */
      65             :   uchar        reverted;             /* if the feature was reverted */
      66             :   uchar        hardcode_for_fuzzing; /* if the should be treated as hardcoded in the firedancer fuzzing harness */
      67             : };
      68             : typedef struct fd_feature_id fd_feature_id_t;
      69             : 
      70             : FD_PROTOTYPES_BEGIN
      71             : 
      72             : /* fd_feature_ids is the list of known feature IDs.
      73             :    The last element has offset==ULONG_MAX. */
      74             : extern fd_feature_id_t const ids[];
      75             : 
      76             : /* fd_features_disable_all disables all features (cleaned_up or not). */
      77             : 
      78             : void
      79             : fd_features_disable_all( fd_features_t * f );
      80             : 
      81             : /* fd_features_enable_all enables all features (supported or not). */
      82             : 
      83             : void
      84             : fd_features_enable_all( fd_features_t * );
      85             : 
      86             : /* fd_features_enable_cleaned_up enables all features marked as "hard
      87             :    coded".  These are features that are baked into the current version
      88             :    of the Firedancer software and can't be disabled. */
      89             : 
      90             : void
      91             : fd_features_enable_cleaned_up( fd_features_t *, fd_cluster_version_t const * );
      92             : 
      93             : /* fd_features_enable_one_offs enables all manually passed in features. */
      94             : 
      95             : void
      96             : fd_features_enable_one_offs( fd_features_t * features,
      97             :                              char const * *  one_offs,
      98             :                              uint            one_offs_cnt,
      99             :                              ulong           slot );
     100             : 
     101             : /* fd_feature_iter_{...} is an iterator-style API over all supported
     102             :    features in this version of Firedancer.  Usage:
     103             : 
     104             :      for( fd_feature_id_t const * id = fd_feature_iter_init();
     105             :                                       !fd_feature_iter_done( id );
     106             :                                   id = fd_feature_iter_next( id ) ) {
     107             :        ...
     108             :      } */
     109             : 
     110             : static inline fd_feature_id_t const *
     111        7695 : fd_feature_iter_init( void ) {
     112        7695 :   return ids;
     113        7695 : }
     114             : 
     115             : static inline int
     116     1923750 : fd_feature_iter_done( fd_feature_id_t const * id ) {
     117     1923750 :   return id->index == ULONG_MAX;
     118     1923750 : }
     119             : 
     120             : static inline fd_feature_id_t const *
     121     1916055 : fd_feature_iter_next( fd_feature_id_t const * id ) {
     122     1916055 :   return id+1;
     123     1916055 : }
     124             : 
     125             : /* fd_features_set sets the activation slot of the given feature ID. */
     126             : 
     127             : static inline void
     128             : fd_features_set( fd_features_t *         features,
     129             :                  fd_feature_id_t const * id,
     130     1918491 :                  ulong                   slot ) {
     131     1918491 :   features->f[ id->index ] = slot;
     132     1918491 : }
     133             : 
     134             : /* fd_features_get returns the activation slot of the given feature ID.
     135             :    Returns ULONG_MAX if the feature is not scheduled for activation. */
     136             : 
     137             : static inline ulong
     138             : fd_features_get( fd_features_t const *   features,
     139         747 :                  fd_feature_id_t const * id ) {
     140         747 :   return features->f[ id->index ];
     141         747 : }
     142             : 
     143             : /* fd_feature_id_query queries a feature ID given the first 8 bytes of
     144             :    the feature address (little-endian order).  Returns pointer to ID in
     145             :    `ids` array on success, or NULL on failure. */
     146             : 
     147             : FD_FN_CONST fd_feature_id_t const *
     148             : fd_feature_id_query( ulong prefix );
     149             : 
     150             : /* fd_features_restore loads all known feature accounts from the
     151             :    accounts database.  This is used when initializing bank from a
     152             :    snapshot. */
     153             : 
     154             : void
     155             : fd_features_restore( fd_bank_t *               bank,
     156             :                      fd_funk_t *               funk,
     157             :                      fd_funk_txn_xid_t const * xid );
     158             : 
     159             : FD_PROTOTYPES_END
     160             : 
     161             : #endif /* HEADER_fd_src_flamenco_features_fd_features_h */

Generated by: LCOV version 1.14