Line data Source code
1 : #ifndef HEADER_fd_src_flamenco_accdb_fd_accdb_admin_h 2 : #define HEADER_fd_src_flamenco_accdb_fd_accdb_admin_h 3 : 4 : #include "fd_accdb_base.h" 5 : #include "../../funk/fd_funk_base.h" 6 : 7 : /* fd_accdb_admin_vt_t specifies the interface (vtable) for the account 8 : DB admin. */ 9 : 10 : struct fd_accdb_admin_vt { 11 : 12 : void 13 : (* fini)( fd_accdb_admin_t * accdb ); 14 : 15 : fd_funk_txn_xid_t 16 : (* root_get)( fd_accdb_admin_t const * admin ); 17 : 18 : void 19 : (* attach_child)( fd_accdb_admin_t * admin, 20 : fd_funk_txn_xid_t const * xid_parent, 21 : fd_funk_txn_xid_t const * xid_new ); 22 : 23 : void 24 : (* advance_root)( fd_accdb_admin_t * admin, 25 : fd_funk_txn_xid_t const * xid ); 26 : 27 : void 28 : (* cancel)( fd_accdb_admin_t * admin, 29 : fd_funk_txn_xid_t const * xid ); 30 : 31 : }; 32 : 33 : typedef struct fd_accdb_admin_vt fd_accdb_admin_vt_t; 34 : 35 : struct fd_accdb_admin_base { 36 : fd_accdb_admin_vt_t const * vt; 37 : uint accdb_type; 38 : 39 : ulong rw_active; 40 : ulong ro_active; 41 : ulong created_cnt; 42 : ulong root_cnt; /* moved to database root */ 43 : ulong reclaim_cnt; /* 0 lamport account removed while rooting */ 44 : ulong gc_root_cnt; /* stale rooted revisions removed while rooting */ 45 : ulong revert_cnt; /* abandoned by consensus */ 46 : }; 47 : 48 : typedef struct fd_accdb_admin_base fd_accdb_admin_base_t; 49 : 50 : struct fd_accdb_admin { 51 : fd_accdb_admin_base_t base; 52 : 53 : uchar impl[ 4096 ] __attribute__((aligned(64))); 54 : }; 55 : 56 : FD_PROTOTYPES_BEGIN 57 : 58 : static inline void 59 66 : fd_accdb_admin_fini( fd_accdb_admin_t * accdb ) { 60 66 : accdb->base.vt->fini( accdb ); 61 66 : } 62 : 63 : /* Transaction-level operations ***************************************/ 64 : 65 : static inline fd_funk_txn_xid_t 66 24 : fd_accdb_root_get( fd_accdb_admin_t const * admin ) { 67 24 : return admin->base.vt->root_get( admin ); 68 24 : } 69 : 70 : /* FIXME rename these to? 71 : - fd_accdb_fork_create 72 : - fd_accdb_fork_freeze 73 : - fd_accdb_fork_commit_root 74 : - fd_accdb_fork_cancel */ 75 : 76 : /* fd_accdb_attach_child creates a new account database fork node off a 77 : frozen parent or the root. 78 : 79 : It is assumed that less than txn_max non-root transaction exist when 80 : this is called. */ 81 : 82 : static inline void 83 : fd_accdb_attach_child( fd_accdb_admin_t * admin, 84 : fd_funk_txn_xid_t const * xid_parent, 85 571872 : fd_funk_txn_xid_t const * xid_new ) { 86 571872 : admin->base.vt->attach_child( admin, xid_parent, xid_new ); 87 571872 : } 88 : 89 : /* fd_accdb_advance_root merges the given fork node into the database 90 : root. */ 91 : 92 : static inline void 93 : fd_accdb_advance_root( fd_accdb_admin_t * admin, 94 224742 : fd_funk_txn_xid_t const * xid ) { 95 224742 : admin->base.vt->advance_root( admin, xid ); 96 224742 : } 97 : 98 : /* fd_accdb_cancel removes a fork node by XID and its children 99 : (recursively). */ 100 : 101 : static inline void 102 : fd_accdb_cancel( fd_accdb_admin_t * admin, 103 51 : fd_funk_txn_xid_t const * xid ) { 104 51 : admin->base.vt->cancel( admin, xid ); 105 51 : } 106 : 107 : FD_PROTOTYPES_END 108 : 109 : #endif /* HEADER_fd_src_flamenco_accdb_fd_accdb_admin_h */