Line data Source code
1 : #include "fd_gui_gossip_bw.h" 2 : #include "../../tango/tempo/fd_tempo.h" 3 : 4 : FD_FN_CONST ulong 5 0 : fd_gui_gossip_bw_align( void ) { 6 0 : return FD_GUI_GOSSIP_BW_ALIGN; 7 0 : } 8 : 9 : FD_FN_CONST ulong 10 0 : fd_gui_gossip_bw_footprint( void ) { 11 0 : ulong l = FD_LAYOUT_INIT; 12 0 : l = FD_LAYOUT_APPEND( l, FD_GUI_GOSSIP_BW_ALIGN, sizeof(fd_gui_gossip_bw_t) ); 13 0 : l = FD_LAYOUT_APPEND( l, fd_gui_gossip_bw_map_align(), fd_gui_gossip_bw_map_footprint( FD_GUI_GOSSIP_BW_LG_SLOT_CNT ) ); 14 0 : return FD_LAYOUT_FINI( l, FD_GUI_GOSSIP_BW_ALIGN ); 15 0 : } 16 : 17 : void * 18 : fd_gui_gossip_bw_new( void * shmem, 19 0 : ulong seed ) { 20 : 21 0 : if( FD_UNLIKELY( !shmem ) ) { 22 0 : FD_LOG_WARNING(( "NULL shmem" )); 23 0 : return NULL; 24 0 : } 25 : 26 0 : if( FD_UNLIKELY( !fd_ulong_is_aligned( (ulong)shmem, fd_gui_gossip_bw_align() ) ) ) { 27 0 : FD_LOG_WARNING(( "misaligned shmem" )); 28 0 : return NULL; 29 0 : } 30 : 31 0 : FD_SCRATCH_ALLOC_INIT( l, shmem ); 32 0 : fd_gui_gossip_bw_t * bw = FD_SCRATCH_ALLOC_APPEND( l, FD_GUI_GOSSIP_BW_ALIGN, sizeof(fd_gui_gossip_bw_t) ); 33 0 : void * _map = FD_SCRATCH_ALLOC_APPEND( l, fd_gui_gossip_bw_map_align(), fd_gui_gossip_bw_map_footprint( FD_GUI_GOSSIP_BW_LG_SLOT_CNT ) ); 34 0 : FD_TEST( FD_SCRATCH_ALLOC_FINI( l, FD_GUI_GOSSIP_BW_ALIGN )==(ulong)shmem+fd_gui_gossip_bw_footprint() ); 35 : 36 0 : bw->flush_ticks = (long)((double)FD_GUI_GOSSIP_BW_FLUSH_NS*fd_tempo_tick_per_ns( NULL )); 37 0 : bw->deadline = LONG_MAX; 38 0 : bw->map = fd_gui_gossip_bw_map_join( fd_gui_gossip_bw_map_new( _map, FD_GUI_GOSSIP_BW_LG_SLOT_CNT, seed ) ); 39 : 40 0 : FD_COMPILER_MFENCE(); 41 0 : FD_VOLATILE( bw->magic ) = FD_GUI_GOSSIP_BW_MAGIC; 42 0 : FD_COMPILER_MFENCE(); 43 : 44 0 : return shmem; 45 0 : } 46 : 47 : fd_gui_gossip_bw_t * 48 0 : fd_gui_gossip_bw_join( void * shbw ) { 49 : 50 0 : if( FD_UNLIKELY( !shbw ) ) { 51 0 : FD_LOG_WARNING(( "NULL shbw" )); 52 0 : return NULL; 53 0 : } 54 : 55 0 : if( FD_UNLIKELY( !fd_ulong_is_aligned( (ulong)shbw, fd_gui_gossip_bw_align() ) ) ) { 56 0 : FD_LOG_WARNING(( "misaligned shbw" )); 57 0 : return NULL; 58 0 : } 59 : 60 0 : fd_gui_gossip_bw_t * bw = (fd_gui_gossip_bw_t *)shbw; 61 0 : if( FD_UNLIKELY( bw->magic!=FD_GUI_GOSSIP_BW_MAGIC ) ) { 62 0 : FD_LOG_WARNING(( "bad magic" )); 63 0 : return NULL; 64 0 : } 65 : 66 0 : return bw; 67 0 : } 68 : 69 : void * 70 0 : fd_gui_gossip_bw_leave( fd_gui_gossip_bw_t const * bw ) { 71 : 72 0 : if( FD_UNLIKELY( !bw ) ) { 73 0 : FD_LOG_WARNING(( "NULL bw" )); 74 0 : return NULL; 75 0 : } 76 : 77 0 : return (void *)bw; 78 0 : } 79 : 80 : void * 81 0 : fd_gui_gossip_bw_delete( void * shbw ) { 82 : 83 0 : if( FD_UNLIKELY( !shbw ) ) { 84 0 : FD_LOG_WARNING(( "NULL shbw" )); 85 0 : return NULL; 86 0 : } 87 : 88 0 : if( FD_UNLIKELY( !fd_ulong_is_aligned( (ulong)shbw, fd_gui_gossip_bw_align() ) ) ) { 89 0 : FD_LOG_WARNING(( "misaligned shbw" )); 90 0 : return NULL; 91 0 : } 92 : 93 0 : fd_gui_gossip_bw_t * bw = (fd_gui_gossip_bw_t *)shbw; 94 0 : if( FD_UNLIKELY( bw->magic!=FD_GUI_GOSSIP_BW_MAGIC ) ) { 95 0 : FD_LOG_WARNING(( "bad magic" )); 96 0 : return NULL; 97 0 : } 98 : 99 0 : FD_COMPILER_MFENCE(); 100 0 : FD_VOLATILE( bw->magic ) = 0UL; 101 0 : FD_COMPILER_MFENCE(); 102 : 103 0 : return shbw; 104 0 : }