Line data Source code
1 : #include "fd_list.h" 2 : 3 : ulong 4 3 : fd_list_align( void ) { 5 3 : return FD_LIST_ALIGN; 6 3 : } 7 : 8 : ulong 9 3 : fd_list_footprint( ulong max ) { 10 3 : return ( max + 1 ) * sizeof( fd_list_t ); 11 3 : } 12 : 13 : void * 14 6 : fd_list_new( void * mem, ulong max ) { 15 6 : fd_list_t * sentinel = (fd_list_t *)mem; 16 6 : sentinel->tag = 0; 17 6 : sentinel->curr = 0; 18 6 : sentinel->prev = 0; 19 6 : sentinel->next = 0; 20 6 : fd_list_t * curr = sentinel; 21 196626 : for ( ulong i = 1; i <= max; i++ ) { 22 196620 : fd_list_t * new = sentinel + i; 23 196620 : new->curr = i; 24 196620 : fd_list_insert( curr, new ); 25 196620 : curr = new; 26 196620 : } 27 6 : return mem; 28 6 : } 29 : 30 : fd_list_t * 31 3 : fd_list_join( void * mem ) { 32 3 : return (fd_list_t *)mem; 33 3 : } 34 : 35 : fd_list_t * 36 1966119 : fd_list_prev( fd_list_t * curr ) { 37 1966119 : return curr - curr->curr + curr->prev; 38 1966119 : } 39 : 40 : fd_list_t * 41 2556000 : fd_list_next( fd_list_t * curr ) { 42 2556000 : return curr - curr->curr + curr->next; 43 2556000 : } 44 : 45 : fd_list_t * 46 1573005 : fd_list_sentinel( fd_list_t * list ) { 47 1573005 : return list - list->curr; 48 1573005 : } 49 : 50 : fd_list_t * 51 786513 : fd_list_head( fd_list_t * list ) { 52 786513 : fd_list_t * sentinel = fd_list_sentinel( list ); 53 786513 : return sentinel + sentinel->next; 54 786513 : } 55 : 56 : fd_list_t * 57 12 : fd_list_tail( fd_list_t * list ) { 58 12 : fd_list_t * sentinel = fd_list_sentinel( list ); 59 12 : return sentinel + sentinel->prev; 60 12 : } 61 : 62 : int 63 786477 : fd_list_is_empty( fd_list_t * list ) { 64 786477 : return fd_list_head(list) == fd_list_sentinel( list ); 65 786477 : } 66 : 67 : fd_list_t * 68 983067 : fd_list_insert( fd_list_t * curr, fd_list_t * new ) { 69 983067 : new->prev = curr->curr; 70 983067 : new->next = curr->next; 71 983067 : fd_list_next( curr )->prev = new->curr; 72 983067 : curr->next = new->curr; 73 983067 : return new; 74 983067 : } 75 : 76 : fd_list_t * 77 786459 : fd_list_remove( fd_list_t * curr ) { 78 786459 : if ( FD_UNLIKELY( fd_list_is_empty( curr ) ) ) return NULL; 79 786459 : fd_list_prev( curr )->next = curr->next; 80 786459 : fd_list_next( curr )->prev = curr->prev; 81 786459 : curr->prev = 0; 82 786459 : curr->next = 0; 83 786459 : return curr; 84 786459 : } 85 : 86 : fd_list_t * 87 3 : fd_list_push_back( fd_list_t * list, fd_list_t * new ) { 88 3 : return fd_list_insert( fd_list_tail( list ), new ); 89 3 : } 90 : 91 : fd_list_t * 92 18 : fd_list_pop_front( fd_list_t * list ) { 93 18 : fd_list_t * head = fd_list_head( list ); 94 18 : if ( FD_UNLIKELY( fd_list_is_empty( list ) ) ) { return NULL; } 95 15 : return fd_list_remove( head ); 96 18 : }