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