|
3 | 3 | #include "fd_snapin_tile_private.h" |
4 | 4 | #include "../../flamenco/accdb/fd_accdb_sync.h" |
5 | 5 |
|
| 6 | +/* rec_pool_acquire is a fast lock-free version of |
| 7 | + fd_funk_rec_pool_acquire. Does bump allocation only. */ |
| 8 | + |
| 9 | +static inline fd_funk_rec_t * |
| 10 | +rec_pool_acquire( fd_funk_rec_pool_t * join ) { |
| 11 | + fd_funk_rec_t * ele0 = join->ele; |
| 12 | + ulong ele_max = join->ele_max; |
| 13 | + |
| 14 | + ulong ver_lazy = join->pool->ver_lazy; |
| 15 | + |
| 16 | + ulong ver = fd_funk_rec_pool_private_vidx_ver( ver_lazy ); |
| 17 | + ulong ele_idx = fd_funk_rec_pool_private_vidx_idx( ver_lazy ); |
| 18 | + |
| 19 | + if( FD_UNLIKELY( fd_funk_rec_pool_idx_is_null( ele_idx ) ) ) { |
| 20 | + return NULL; |
| 21 | + } |
| 22 | + |
| 23 | + ulong ele_nxt = ele_idx+1UL; |
| 24 | + if( FD_UNLIKELY( ele_nxt>=ele_max ) ) ele_nxt = fd_funk_rec_pool_idx_null(); |
| 25 | + |
| 26 | + ulong new_ver_lazy = fd_funk_rec_pool_private_vidx( ver, ele_nxt ); |
| 27 | + join->pool->ver_lazy = new_ver_lazy; |
| 28 | + return ele0 + ele_idx; |
| 29 | +} |
| 30 | + |
6 | 31 | int |
7 | 32 | fd_snapin_process_account_header_funk( fd_snapin_tile_t * ctx, |
8 | 33 | fd_ssparse_advance_result_t * result ) { |
@@ -189,7 +214,7 @@ fd_snapin_process_account_batch_funk( fd_snapin_tile_t * ctx, |
189 | 214 |
|
190 | 215 | fd_funk_rec_t * r = rec[ i ]; |
191 | 216 | if( FD_LIKELY( !r ) ) { /* optimize for new account */ |
192 | | - r = fd_funk_rec_pool_acquire( funk->rec_pool, NULL, 0, NULL ); |
| 217 | + r = rec_pool_acquire( funk->rec_pool ); |
193 | 218 | FD_TEST( r ); |
194 | 219 | memset( r, 0, sizeof(fd_funk_rec_t) ); |
195 | 220 | fd_funk_txn_xid_copy( r->pair.xid, ctx->xid ); |
|
0 commit comments