LCOV - code coverage report
Current view: top level - flamenco/runtime/context - fd_exec_txn_ctx.c (source / functions) Hit Total Coverage
Test: cov.lcov Lines: 91 171 53.2 %
Date: 2024-11-13 11:58:15 Functions: 9 14 64.3 %

          Line data    Source code
       1             : #include "fd_exec_txn_ctx.h"
       2             : #include "fd_exec_slot_ctx.h"
       3             : #include "../fd_acc_mgr.h"
       4             : #include "../fd_executor.h"
       5             : #include "../../vm/fd_vm.h"
       6             : #include "../fd_account.h"
       7             : 
       8             : void *
       9      108786 : fd_exec_txn_ctx_new( void * mem ) {
      10      108786 :   if( FD_UNLIKELY( !mem ) ) {
      11           0 :     FD_LOG_WARNING(( "NULL mem" ));
      12           0 :     return NULL;
      13           0 :   }
      14             : 
      15      108786 :   if( FD_UNLIKELY( !fd_ulong_is_aligned( (ulong)mem, FD_EXEC_TXN_CTX_ALIGN ) ) ) {
      16           0 :     FD_LOG_WARNING(( "misaligned mem" ));
      17           0 :     return NULL;
      18           0 :   }
      19             : 
      20      108786 :   fd_exec_txn_ctx_t * self = (fd_exec_txn_ctx_t *) mem;
      21             : 
      22      108786 :   FD_COMPILER_MFENCE();
      23      108786 :   self->magic = FD_EXEC_TXN_CTX_MAGIC;
      24      108786 :   FD_COMPILER_MFENCE();
      25             : 
      26      108786 :   return mem;
      27      108786 : }
      28             : 
      29             : fd_exec_txn_ctx_t *
      30       97416 : fd_exec_txn_ctx_join( void * mem ) {
      31       97416 :   if( FD_UNLIKELY( !mem ) ) {
      32           0 :     FD_LOG_WARNING(( "NULL block" ));
      33           0 :     return NULL;
      34           0 :   }
      35             : 
      36       97416 :   fd_exec_txn_ctx_t * ctx = (fd_exec_txn_ctx_t *) mem;
      37             : 
      38       97416 :   if( FD_UNLIKELY( ctx->magic!=FD_EXEC_TXN_CTX_MAGIC ) ) {
      39           0 :     FD_LOG_WARNING(( "bad magic" ));
      40           0 :     return NULL;
      41           0 :   }
      42             : 
      43       97416 :   return ctx;
      44       97416 : }
      45             : 
      46             : void *
      47           0 : fd_exec_txn_ctx_leave( fd_exec_txn_ctx_t * ctx) {
      48           0 :   if( FD_UNLIKELY( !ctx ) ) {
      49           0 :     FD_LOG_WARNING(( "NULL block" ));
      50           0 :     return NULL;
      51           0 :   }
      52             : 
      53           0 :   if( FD_UNLIKELY( ctx->magic!=FD_EXEC_TXN_CTX_MAGIC ) ) {
      54           0 :     FD_LOG_WARNING(( "bad magic" ));
      55           0 :     return NULL;
      56           0 :   }
      57             : 
      58           0 :   return (void *) ctx;
      59           0 : }
      60             : 
      61             : void *
      62           0 : fd_exec_txn_ctx_delete( void * mem ) {
      63           0 :   if( FD_UNLIKELY( !mem ) ) {
      64           0 :     FD_LOG_WARNING(( "NULL mem" ));
      65           0 :     return NULL;
      66           0 :   }
      67             : 
      68           0 :   if( FD_UNLIKELY( !fd_ulong_is_aligned( (ulong)mem, FD_EXEC_TXN_CTX_ALIGN) ) )  {
      69           0 :     FD_LOG_WARNING(( "misaligned mem" ));
      70           0 :     return NULL;
      71           0 :   }
      72             : 
      73           0 :   fd_exec_txn_ctx_t * hdr = (fd_exec_txn_ctx_t *)mem;
      74           0 :   if( FD_UNLIKELY( hdr->magic!=FD_EXEC_TXN_CTX_MAGIC ) ) {
      75           0 :     FD_LOG_WARNING(( "bad magic" ));
      76           0 :     return NULL;
      77           0 :   }
      78             : 
      79           0 :   FD_COMPILER_MFENCE();
      80           0 :   FD_VOLATILE( hdr->magic ) = 0UL;
      81           0 :   FD_COMPILER_MFENCE();
      82             : 
      83           0 :   return mem;
      84           0 : }
      85             : 
      86             : int
      87             : fd_txn_borrowed_account_view_idx( fd_exec_txn_ctx_t * ctx,
      88             :                                   uchar idx,
      89      137412 :                                   fd_borrowed_account_t * * account ) {
      90      137412 :   if( FD_UNLIKELY( idx>=ctx->accounts_cnt ) ) {
      91           0 :     return FD_ACC_MGR_ERR_UNKNOWN_ACCOUNT;
      92           0 :   }
      93             : 
      94      137412 :   fd_borrowed_account_t * txn_account = &ctx->borrowed_accounts[idx];
      95      137412 :   *account = txn_account;
      96             : 
      97      137412 :   if( FD_UNLIKELY( !fd_acc_exists( txn_account->const_meta ) ) ) {
      98        1443 :     return FD_ACC_MGR_ERR_UNKNOWN_ACCOUNT;
      99        1443 :   }
     100             : 
     101      135969 :   return FD_ACC_MGR_SUCCESS;
     102      137412 : }
     103             : 
     104             : int
     105             : fd_txn_borrowed_account_view_idx_allow_dead( fd_exec_txn_ctx_t * ctx,
     106             :                                              uchar idx,
     107         900 :                                              fd_borrowed_account_t * * account ) {
     108         900 :   if( FD_UNLIKELY( idx>=ctx->accounts_cnt ) ) {
     109         108 :     return FD_ACC_MGR_ERR_UNKNOWN_ACCOUNT;
     110         108 :   }
     111             : 
     112         792 :   fd_borrowed_account_t * txn_account = &ctx->borrowed_accounts[idx];
     113         792 :   *account = txn_account;
     114             : 
     115         792 :   return FD_ACC_MGR_SUCCESS;
     116         900 : }
     117             : 
     118             : int
     119             : fd_txn_borrowed_account_view( fd_exec_txn_ctx_t * ctx,
     120             :                               fd_pubkey_t const *      pubkey,
     121           0 :                               fd_borrowed_account_t * * account ) {
     122           0 :   for( ulong i = 0; i < ctx->accounts_cnt; i++ ) {
     123           0 :     if( memcmp( pubkey->uc, ctx->accounts[i].uc, sizeof(fd_pubkey_t) )==0 ) {
     124             :       // TODO: check if readable???
     125           0 :       fd_borrowed_account_t * txn_account = &ctx->borrowed_accounts[i];
     126           0 :       *account = txn_account;
     127             : 
     128           0 :       if( FD_UNLIKELY( !fd_acc_exists( txn_account->const_meta ) ) ) {
     129           0 :         return FD_ACC_MGR_ERR_UNKNOWN_ACCOUNT;
     130           0 :       }
     131             : 
     132           0 :       return FD_ACC_MGR_SUCCESS;
     133           0 :     }
     134           0 :   }
     135             : 
     136           0 :   return FD_ACC_MGR_ERR_UNKNOWN_ACCOUNT;
     137           0 : }
     138             : 
     139             : int
     140             : fd_txn_borrowed_account_executable_view( fd_exec_txn_ctx_t * ctx,
     141             :                                          fd_pubkey_t const *      pubkey,
     142         909 :                                          fd_borrowed_account_t * * account ) {
     143        1059 :   for( ulong i = 0; i < ctx->executable_cnt; i++ ) {
     144        1053 :     if( memcmp( pubkey->uc, ctx->executable_accounts[i].pubkey->uc, sizeof(fd_pubkey_t) )==0 ) {
     145             :       // TODO: check if readable???
     146         903 :       fd_borrowed_account_t * txn_account = &ctx->executable_accounts[i];
     147         903 :       *account = txn_account;
     148             : 
     149         903 :       if( FD_UNLIKELY( !fd_acc_exists( txn_account->const_meta ) ) )
     150           0 :         return FD_ACC_MGR_ERR_UNKNOWN_ACCOUNT;
     151             : 
     152         903 :       return FD_ACC_MGR_SUCCESS;
     153         903 :     }
     154        1053 :   }
     155             : 
     156           6 :   return FD_ACC_MGR_ERR_UNKNOWN_ACCOUNT;
     157         909 : }
     158             : 
     159             : int
     160             : fd_txn_borrowed_account_modify_idx( fd_exec_txn_ctx_t *        ctx,
     161             :                                     uchar                      idx,
     162             :                                     ulong                      min_data_sz,
     163        6111 :                                     fd_borrowed_account_t * *  account ) {
     164        6111 :   if( idx >= ctx->accounts_cnt ) {
     165           0 :     return FD_ACC_MGR_ERR_UNKNOWN_ACCOUNT;
     166           0 :   }
     167             : 
     168        6111 :   fd_borrowed_account_t * txn_account = &ctx->borrowed_accounts[idx];
     169        6111 :   if( FD_UNLIKELY( !fd_txn_account_is_writable_idx( ctx, (int)idx ) ) ) {
     170           0 :     return FD_ACC_MGR_ERR_WRITE_FAILED;
     171           0 :   }
     172             : 
     173        6111 :   if( min_data_sz > txn_account->const_meta->dlen ) {
     174           0 :     fd_borrowed_account_resize( txn_account, min_data_sz );
     175           0 :   }
     176             : 
     177        6111 :   *account = txn_account;
     178        6111 :   return FD_ACC_MGR_SUCCESS;
     179        6111 : }
     180             : 
     181             : int
     182             : fd_txn_borrowed_account_modify( fd_exec_txn_ctx_t *       ctx,
     183             :                                 fd_pubkey_t const *       pubkey,
     184             :                                 ulong                     min_data_sz,
     185           0 :                                 fd_borrowed_account_t * * account ) {
     186           0 :   for( ulong i = 0; i < ctx->accounts_cnt; i++ ) {
     187           0 :     if( memcmp( pubkey->uc, ctx->accounts[i].uc, sizeof(fd_pubkey_t) )==0 ) {
     188             :       // TODO: check if writable???
     189           0 :       fd_borrowed_account_t * txn_account = &ctx->borrowed_accounts[i];
     190           0 :       if( min_data_sz > txn_account->const_meta->dlen ) {
     191           0 :         fd_borrowed_account_resize( txn_account, min_data_sz );
     192           0 :       }
     193           0 :       *account = txn_account;
     194           0 :       return FD_ACC_MGR_SUCCESS;
     195           0 :     }
     196           0 :   }
     197             : 
     198           0 :   return FD_ACC_MGR_ERR_UNKNOWN_ACCOUNT;
     199           0 : }
     200             : 
     201             : void
     202             : fd_exec_txn_ctx_setup( fd_exec_txn_ctx_t   * txn_ctx,
     203             :                        fd_txn_t      const * txn_descriptor,
     204       11370 :                        fd_rawtxn_b_t const * txn_raw ) {
     205       11370 :   txn_ctx->compute_unit_limit = 200000;
     206       11370 :   txn_ctx->compute_unit_price = 0;
     207       11370 :   txn_ctx->compute_meter      = 200000;
     208       11370 :   txn_ctx->prioritization_fee_type = FD_COMPUTE_BUDGET_PRIORITIZATION_FEE_TYPE_DEPRECATED;
     209       11370 :   txn_ctx->custom_err         = UINT_MAX;
     210             : 
     211       11370 :   txn_ctx->instr_stack_sz     = 0;
     212       11370 :   txn_ctx->accounts_cnt       = 0;
     213       11370 :   txn_ctx->executable_cnt     = 0;
     214       11370 :   txn_ctx->paid_fees          = 0;
     215       11370 :   txn_ctx->heap_size          = FD_VM_HEAP_DEFAULT;
     216       11370 :   txn_ctx->loaded_accounts_data_size_limit = FD_VM_LOADED_ACCOUNTS_DATA_SIZE_LIMIT;
     217       11370 :   txn_ctx->accounts_resize_delta = 0;
     218       11370 :   txn_ctx->collected_rent     = 0UL;
     219             : 
     220       11370 :   txn_ctx->txn_descriptor = txn_descriptor;
     221       11370 :   txn_ctx->_txn_raw->raw = txn_raw->raw;
     222       11370 :   txn_ctx->_txn_raw->txn_sz = txn_raw->txn_sz;
     223             : 
     224       11370 :   txn_ctx->num_instructions = 0;
     225       11370 :   memset( txn_ctx->return_data.program_id.key, 0, sizeof(fd_pubkey_t) );
     226       11370 :   txn_ctx->return_data.len = 0;
     227             : 
     228       11370 :   txn_ctx->dirty_vote_acc  = 0;
     229       11370 :   txn_ctx->dirty_stake_acc = 0;
     230       11370 :   txn_ctx->failed_instr    = NULL;
     231       11370 :   txn_ctx->instr_err_idx   = INT_MAX;
     232       11370 :   txn_ctx->capture_ctx     = NULL;
     233             : 
     234       11370 :   txn_ctx->instr_info_cnt     = 0;
     235       11370 :   txn_ctx->instr_trace_length = 0;
     236             : 
     237       11370 :   txn_ctx->exec_err      = 0;
     238       11370 :   txn_ctx->exec_err_kind = FD_EXECUTOR_ERR_KIND_EBPF;
     239       11370 : }
     240             : 
     241             : void
     242           0 : fd_exec_txn_ctx_teardown( fd_exec_txn_ctx_t * txn_ctx ) {
     243           0 :   (void)txn_ctx;
     244           0 : }
     245             : 
     246             : void
     247             : fd_exec_txn_ctx_from_exec_slot_ctx( fd_exec_slot_ctx_t * slot_ctx,
     248       11370 :                                     fd_exec_txn_ctx_t * txn_ctx ) {
     249       11370 :   txn_ctx->slot_ctx = slot_ctx;
     250       11370 :   txn_ctx->epoch_ctx = slot_ctx->epoch_ctx;
     251       11370 :   txn_ctx->valloc = slot_ctx->valloc;
     252       11370 :   txn_ctx->funk_txn = NULL;
     253       11370 :   txn_ctx->acc_mgr = slot_ctx->acc_mgr;
     254       11370 : }
     255             : 
     256             : void
     257       93645 : fd_exec_txn_ctx_reset_return_data( fd_exec_txn_ctx_t * txn_ctx ) {
     258       93645 :   txn_ctx->return_data.len = 0;
     259       93645 : }

Generated by: LCOV version 1.14