Line data Source code
1 : #include "fd_vinyl_cq.h" 2 : 3 : ulong 4 0 : fd_vinyl_cq_align( void ) { 5 0 : return alignof(fd_vinyl_cq_t); 6 0 : } 7 : 8 : ulong 9 0 : fd_vinyl_cq_footprint( ulong comp_cnt ) { 10 0 : if( FD_UNLIKELY( !((4UL<=comp_cnt) & (comp_cnt<(1UL<<63)/sizeof(fd_vinyl_comp_t)) & fd_ulong_is_pow2( comp_cnt )) ) ) return 0UL; 11 0 : return fd_ulong_align_up( sizeof(fd_vinyl_cq_t) + comp_cnt*sizeof(fd_vinyl_comp_t), alignof(fd_vinyl_cq_t) ); /* no overflow */ 12 0 : } 13 : 14 : void * 15 : fd_vinyl_cq_new( void * shmem, 16 0 : ulong comp_cnt ) { 17 0 : fd_vinyl_cq_t * cq = (fd_vinyl_cq_t *)shmem; 18 : 19 0 : if( FD_UNLIKELY( !cq ) ) { 20 0 : FD_LOG_WARNING(( "NULL shmem")); 21 0 : return NULL; 22 0 : } 23 : 24 0 : if( FD_UNLIKELY( !fd_ulong_is_aligned( (ulong)cq, fd_vinyl_cq_align() ) ) ) { 25 0 : FD_LOG_WARNING(( "bad align")); 26 0 : return NULL; 27 0 : } 28 : 29 0 : ulong footprint = fd_vinyl_cq_footprint( comp_cnt ); 30 0 : if( FD_UNLIKELY( !footprint) ) { 31 0 : FD_LOG_WARNING(( "bad comp_cnt")); 32 0 : return NULL; 33 0 : } 34 : 35 0 : memset( cq, 0, footprint ); 36 : 37 0 : cq->comp_cnt = comp_cnt; 38 0 : cq->seq = 0UL; 39 : 40 0 : fd_vinyl_comp_t * comp = fd_vinyl_cq_comp( cq ); 41 : 42 0 : for( ulong seq=0UL; seq<comp_cnt; seq++ ) comp[ seq ].seq = seq - 1UL; /* Just before the next seq to be written to this entry */ 43 : 44 0 : FD_COMPILER_MFENCE(); 45 0 : cq->magic = FD_VINYL_CQ_MAGIC; 46 0 : FD_COMPILER_MFENCE(); 47 : 48 0 : return cq; 49 0 : } 50 : 51 : fd_vinyl_cq_t * 52 0 : fd_vinyl_cq_join ( void * shcq ) { 53 0 : fd_vinyl_cq_t * cq = (fd_vinyl_cq_t *)shcq; 54 : 55 0 : if( FD_UNLIKELY( !cq ) ) { 56 0 : FD_LOG_WARNING(( "NULL shcq")); 57 0 : return NULL; 58 0 : } 59 : 60 0 : if( FD_UNLIKELY( !fd_ulong_is_aligned( (ulong)cq, fd_vinyl_cq_align() ) ) ) { 61 0 : FD_LOG_WARNING(( "bad align")); 62 0 : return NULL; 63 0 : } 64 : 65 0 : if( FD_UNLIKELY( cq->magic!=FD_VINYL_CQ_MAGIC ) ) { 66 0 : FD_LOG_WARNING(( "bad magic")); 67 0 : return NULL; 68 0 : } 69 : 70 0 : return (fd_vinyl_cq_t *)shcq; 71 0 : } 72 : 73 : void * 74 0 : fd_vinyl_cq_leave( fd_vinyl_cq_t * cq ) { 75 : 76 0 : if( FD_UNLIKELY( !cq ) ) { 77 0 : FD_LOG_WARNING(( "NULL cq")); 78 0 : return NULL; 79 0 : } 80 : 81 0 : return cq; 82 0 : } 83 : 84 : void * 85 0 : fd_vinyl_cq_delete( void * shcq ) { 86 0 : fd_vinyl_cq_t * cq = (fd_vinyl_cq_t *)shcq; 87 : 88 0 : if( FD_UNLIKELY( !cq ) ) { 89 0 : FD_LOG_WARNING(( "NULL shcq")); 90 0 : return NULL; 91 0 : } 92 : 93 0 : if( FD_UNLIKELY( !fd_ulong_is_aligned( (ulong)cq, fd_vinyl_cq_align() ) ) ) { 94 0 : FD_LOG_WARNING(( "bad align")); 95 0 : return NULL; 96 0 : } 97 : 98 0 : if( FD_UNLIKELY( cq->magic!=FD_VINYL_CQ_MAGIC ) ) { 99 0 : FD_LOG_WARNING(( "bad magic")); 100 0 : return NULL; 101 0 : } 102 : 103 0 : FD_COMPILER_MFENCE(); 104 0 : cq->magic = 0UL; 105 0 : FD_COMPILER_MFENCE(); 106 : 107 0 : return cq; 108 0 : }