Changeset 71b00dcc in mainline for uspace/srv/net/structures/dynamic_fifo.c
- Timestamp:
- 2010-03-07T22:51:38Z (15 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 60ab6c3
- Parents:
- b5cbff4 (diff), 31c80a5 (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the(diff)
links above to see all the changes relative to each parent. - File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/srv/net/structures/dynamic_fifo.c
rb5cbff4 r71b00dcc 50 50 * @param[in] index The actual index to be shifted. 51 51 */ 52 #define NEXT_INDEX( fifo, index ) ((( index ) + 1 ) % (( fifo )->size + 1))52 #define NEXT_INDEX(fifo, index) (((index) + 1) % ((fifo)->size + 1)) 53 53 54 54 /** Checks if the queue is valid. … … 57 57 * @returns FALSE otherwise. 58 58 */ 59 int dyn_fifo_is_valid( dyn_fifo_ref fifo);59 int dyn_fifo_is_valid(dyn_fifo_ref fifo); 60 60 61 int dyn_fifo_is_valid( dyn_fifo_ref fifo){62 return fifo && ( fifo->magic_value == DYN_FIFO_MAGIC_VALUE);61 int dyn_fifo_is_valid(dyn_fifo_ref fifo){ 62 return fifo && (fifo->magic_value == DYN_FIFO_MAGIC_VALUE); 63 63 } 64 64 65 int dyn_fifo_initialize( dyn_fifo_ref fifo, int size ){ 66 if( ! fifo ) return EBADMEM; 67 if( size <= 0 ) return EINVAL; 68 fifo->items = ( int * ) malloc( sizeof( int ) * size + 1 ); 69 if( ! fifo->items ) return ENOMEM; 65 int dyn_fifo_initialize(dyn_fifo_ref fifo, int size){ 66 if(! fifo){ 67 return EBADMEM; 68 } 69 if(size <= 0){ 70 return EINVAL; 71 } 72 fifo->items = (int *) malloc(sizeof(int) * size + 1); 73 if(! fifo->items){ 74 return ENOMEM; 75 } 70 76 fifo->size = size; 71 77 fifo->head = 0; … … 75 81 } 76 82 77 int dyn_fifo_push( dyn_fifo_ref fifo, int value, int max_size){78 int * 83 int dyn_fifo_push(dyn_fifo_ref fifo, int value, int max_size){ 84 int * new_items; 79 85 80 if( ! dyn_fifo_is_valid( fifo )) return EINVAL; 81 if( NEXT_INDEX( fifo, fifo->tail ) == fifo->head ){ 82 if(( max_size > 0 ) && (( fifo->size * 2 ) > max_size )){ 83 if( fifo->size >= max_size ) return ENOMEM; 86 if(! dyn_fifo_is_valid(fifo)){ 87 return EINVAL; 88 } 89 if(NEXT_INDEX(fifo, fifo->tail) == fifo->head){ 90 if((max_size > 0) && ((fifo->size * 2) > max_size)){ 91 if(fifo->size >= max_size){ 92 return ENOMEM; 93 } 84 94 }else{ 85 95 max_size = fifo->size * 2; 86 96 } 87 new_items = realloc( fifo->items, sizeof( int ) * max_size + 1 ); 88 if( ! new_items ) return ENOMEM; 97 new_items = realloc(fifo->items, sizeof(int) * max_size + 1); 98 if(! new_items){ 99 return ENOMEM; 100 } 89 101 fifo->items = new_items; 90 if( fifo->tail < fifo->head){91 if( fifo->tail < max_size - fifo->size){92 memcpy( fifo->items + fifo->size + 1, fifo->items, fifo->tail * sizeof( int));102 if(fifo->tail < fifo->head){ 103 if(fifo->tail < max_size - fifo->size){ 104 memcpy(fifo->items + fifo->size + 1, fifo->items, fifo->tail * sizeof(int)); 93 105 fifo->tail += fifo->size + 1; 94 106 }else{ 95 memcpy( fifo->items + fifo->size + 1, fifo->items, ( max_size - fifo->size ) * sizeof( int));96 memcpy( fifo->items, fifo->items + max_size - fifo->size, fifo->tail - max_size + fifo->size);107 memcpy(fifo->items + fifo->size + 1, fifo->items, (max_size - fifo->size) * sizeof(int)); 108 memcpy(fifo->items, fifo->items + max_size - fifo->size, fifo->tail - max_size + fifo->size); 97 109 fifo->tail -= max_size - fifo->size; 98 110 } … … 100 112 fifo->size = max_size; 101 113 } 102 fifo->items[ fifo->tail] = value;103 fifo->tail = NEXT_INDEX( fifo, fifo->tail);114 fifo->items[fifo->tail] = value; 115 fifo->tail = NEXT_INDEX(fifo, fifo->tail); 104 116 return EOK; 105 117 } 106 118 107 int dyn_fifo_pop( dyn_fifo_ref fifo){108 int 119 int dyn_fifo_pop(dyn_fifo_ref fifo){ 120 int value; 109 121 110 if( ! dyn_fifo_is_valid( fifo )) return EINVAL; 111 if( fifo->head == fifo->tail ) return ENOENT; 112 value = fifo->items[ fifo->head ]; 113 fifo->head = NEXT_INDEX( fifo, fifo->head ); 122 if(! dyn_fifo_is_valid(fifo)){ 123 return EINVAL; 124 } 125 if(fifo->head == fifo->tail){ 126 return ENOENT; 127 } 128 value = fifo->items[fifo->head]; 129 fifo->head = NEXT_INDEX(fifo, fifo->head); 114 130 return value; 115 131 } 116 132 117 int dyn_fifo_value( dyn_fifo_ref fifo ){ 118 if( ! dyn_fifo_is_valid( fifo )) return EINVAL; 119 if( fifo->head == fifo->tail ) return ENOENT; 120 return fifo->items[ fifo->head ]; 133 int dyn_fifo_value(dyn_fifo_ref fifo){ 134 if(! dyn_fifo_is_valid(fifo)){ 135 return EINVAL; 136 } 137 if(fifo->head == fifo->tail){ 138 return ENOENT; 139 } 140 return fifo->items[fifo->head]; 121 141 } 122 142 123 int dyn_fifo_destroy( dyn_fifo_ref fifo ){ 124 if( ! dyn_fifo_is_valid( fifo )) return EINVAL; 125 free( fifo->items ); 143 int dyn_fifo_destroy(dyn_fifo_ref fifo){ 144 if(! dyn_fifo_is_valid(fifo)){ 145 return EINVAL; 146 } 147 free(fifo->items); 126 148 fifo->magic_value = 0; 127 149 return EOK;
Note:
See TracChangeset
for help on using the changeset viewer.