Line data Source code
1 : #include "fd_keyswitch.h" 2 : 3 : FD_FN_CONST ulong 4 12 : fd_keyswitch_align( void ) { 5 12 : return FD_KEYSWITCH_ALIGN; 6 12 : } 7 : 8 : FD_FN_CONST ulong 9 12 : fd_keyswitch_footprint( void ) { 10 12 : return FD_KEYSWITCH_FOOTPRINT; 11 12 : } 12 : 13 : void * 14 : fd_keyswitch_new( void * shmem, 15 0 : ulong state ) { 16 0 : fd_keyswitch_t * ks = (fd_keyswitch_t *)shmem; 17 : 18 0 : if( FD_UNLIKELY( !shmem ) ) { 19 0 : FD_LOG_WARNING(( "NULL shmem" )); 20 0 : return NULL; 21 0 : } 22 : 23 0 : if( FD_UNLIKELY( !fd_ulong_is_aligned( (ulong)shmem, fd_keyswitch_align() ) ) ) { 24 0 : FD_LOG_WARNING(( "misaligned shmem" )); 25 0 : return NULL; 26 0 : } 27 : 28 0 : ulong footprint = fd_keyswitch_footprint(); 29 : 30 0 : fd_memset( ks, 0, footprint ); 31 0 : ks->state = state; 32 : 33 0 : FD_COMPILER_MFENCE(); 34 0 : FD_VOLATILE( ks->magic ) = FD_KEYSWITCH_MAGIC; 35 0 : FD_COMPILER_MFENCE(); 36 : 37 0 : return (void *)ks; 38 0 : } 39 : 40 : fd_keyswitch_t * 41 0 : fd_keyswitch_join( void * shks ) { 42 : 43 0 : if( FD_UNLIKELY( !shks ) ) { 44 0 : FD_LOG_WARNING(( "NULL shks" )); 45 0 : return NULL; 46 0 : } 47 : 48 0 : if( FD_UNLIKELY( !fd_ulong_is_aligned( (ulong)shks, fd_keyswitch_align() ) ) ) { 49 0 : FD_LOG_WARNING(( "misaligned shks" )); 50 0 : return NULL; 51 0 : } 52 : 53 0 : fd_keyswitch_t * ks = (fd_keyswitch_t *)shks; 54 : 55 0 : if( FD_UNLIKELY( ks->magic!=FD_KEYSWITCH_MAGIC ) ) { 56 0 : FD_LOG_WARNING(( "bad magic" )); 57 0 : return NULL; 58 0 : } 59 : 60 0 : return ks; 61 0 : } 62 : 63 : void * 64 0 : fd_keyswitch_leave( fd_keyswitch_t const * ks ) { 65 : 66 0 : if( FD_UNLIKELY( !ks ) ) { 67 0 : FD_LOG_WARNING(( "NULL ks" )); 68 0 : return NULL; 69 0 : } 70 : 71 0 : return (void *)ks; 72 0 : } 73 : 74 : void * 75 0 : fd_keyswitch_delete( void * shks ) { 76 : 77 0 : if( FD_UNLIKELY( !shks ) ) { 78 0 : FD_LOG_WARNING(( "NULL shks" )); 79 0 : return NULL; 80 0 : } 81 : 82 0 : if( FD_UNLIKELY( !fd_ulong_is_aligned( (ulong)shks, fd_keyswitch_align() ) ) ) { 83 0 : FD_LOG_WARNING(( "misaligned shks" )); 84 0 : return NULL; 85 0 : } 86 : 87 0 : fd_keyswitch_t * ks = (fd_keyswitch_t *)shks; 88 : 89 0 : if( FD_UNLIKELY( ks->magic!=FD_KEYSWITCH_MAGIC ) ) { 90 0 : FD_LOG_WARNING(( "bad magic" )); 91 0 : return NULL; 92 0 : } 93 : 94 0 : FD_COMPILER_MFENCE(); 95 0 : FD_VOLATILE( ks->magic ) = 0UL; 96 0 : FD_COMPILER_MFENCE(); 97 : 98 0 : return (void *)ks; 99 0 : }