Line data Source code
1 : #include "fd_runtime_public.h" 2 : 3 : FD_FN_CONST ulong 4 0 : fd_runtime_public_align( void ) { 5 0 : return fd_ulong_max( alignof(fd_runtime_public_t), fd_spad_align() ); 6 0 : } 7 : 8 : ulong 9 0 : fd_runtime_public_footprint( ulong spad_mem_max ) { 10 0 : return FD_LAYOUT_FINI( FD_LAYOUT_APPEND( FD_LAYOUT_APPEND( FD_LAYOUT_INIT, 11 0 : alignof(fd_runtime_public_t), sizeof(fd_runtime_public_t) ), 12 0 : fd_spad_align(), fd_spad_footprint( spad_mem_max ) ), 13 0 : fd_runtime_public_align() ); 14 0 : } 15 : 16 : fd_runtime_public_t * 17 0 : fd_runtime_public_join( void * shmem ) { 18 0 : fd_runtime_public_t * pub = (fd_runtime_public_t *)shmem; 19 : 20 0 : if( FD_UNLIKELY( pub->magic!=FD_RUNTIME_PUBLIC_MAGIC ) ) { 21 0 : FD_LOG_WARNING(( "Bad Magic" )); 22 0 : return NULL; 23 0 : } 24 : 25 0 : if( FD_UNLIKELY( pub->runtime_spad_gaddr==0UL ) ) { 26 0 : FD_LOG_WARNING(( "Bad runtime spad allocation" )); 27 0 : return NULL; 28 0 : } 29 : 30 0 : fd_wksp_t * wksp = fd_wksp_containing( shmem ); 31 0 : if( FD_UNLIKELY( !wksp ) ) { 32 0 : FD_LOG_WARNING(( "No wksp containing shmem found" )); 33 0 : return NULL; 34 0 : } 35 : 36 0 : return pub; 37 0 : } 38 : 39 : void * 40 : fd_runtime_public_new( void * shmem, 41 0 : ulong spad_mem_max ) { 42 0 : fd_wksp_t * wksp = fd_wksp_containing( shmem ); 43 0 : if( FD_UNLIKELY( !wksp ) ) { 44 0 : FD_LOG_WARNING(( "shmem is not part of a workspace" )); 45 0 : return NULL; 46 0 : } 47 : 48 0 : FD_SCRATCH_ALLOC_INIT( l, shmem ); 49 0 : fd_runtime_public_t * this = FD_SCRATCH_ALLOC_APPEND( l, fd_runtime_public_align(), sizeof(fd_runtime_public_t) ); 50 0 : void * spad_mem = FD_SCRATCH_ALLOC_APPEND( l, fd_spad_align(), fd_spad_footprint( spad_mem_max ) ); 51 0 : FD_SCRATCH_ALLOC_FINI( l, fd_runtime_public_align() ); 52 : 53 0 : fd_memset( this, 0, sizeof(fd_runtime_public_t) ); 54 : 55 0 : if( FD_UNLIKELY( !fd_spad_new( spad_mem, spad_mem_max ) ) ) { 56 0 : FD_LOG_WARNING(( "Unable to create spad" )); 57 0 : return NULL; 58 0 : } 59 : 60 0 : this->runtime_spad_gaddr = fd_wksp_gaddr( wksp, spad_mem ); 61 0 : if( FD_UNLIKELY( !this->runtime_spad_gaddr ) ) { 62 0 : FD_LOG_CRIT(( "fd_wksp_gaddr(%p) failed", spad_mem )); /* unreachable */ 63 0 : } 64 : 65 0 : FD_COMPILER_MFENCE(); 66 0 : this->magic = FD_RUNTIME_PUBLIC_MAGIC; 67 0 : FD_COMPILER_MFENCE(); 68 : 69 0 : return shmem; 70 0 : } 71 : 72 : fd_spad_t * 73 0 : fd_runtime_public_spad( fd_runtime_public_t const * runtime_public ) { 74 0 : if( FD_UNLIKELY( !runtime_public ) ) { 75 0 : FD_LOG_WARNING(( "NULL runtime_public" )); 76 0 : return NULL; 77 0 : } 78 : 79 0 : fd_wksp_t * wksp = fd_wksp_containing( runtime_public ); 80 0 : if( FD_UNLIKELY( !wksp ) ) { 81 0 : FD_LOG_WARNING(( "runtime_public is not part of a wksp" )); 82 0 : return NULL; 83 0 : } 84 : 85 0 : void * spad_laddr = fd_wksp_laddr( wksp, runtime_public->runtime_spad_gaddr ); 86 0 : if( FD_UNLIKELY( !spad_laddr ) ) { 87 0 : FD_LOG_CRIT(( "fd_wksp_laddr(%p,0x%lx) failed", (void *)wksp, runtime_public->runtime_spad_gaddr )); /* unreachable */ 88 0 : return NULL; 89 0 : } 90 : 91 0 : return fd_spad_join( spad_laddr ); 92 0 : }