16e61d062093a71e267aed02870607fc5a0d7d8f4Jakob Bornecrantz/************************************************************************** 26e61d062093a71e267aed02870607fc5a0d7d8f4Jakob Bornecrantz * 36e61d062093a71e267aed02870607fc5a0d7d8f4Jakob Bornecrantz * Copyright © 2009 Jakob Bornecrantz 46e61d062093a71e267aed02870607fc5a0d7d8f4Jakob Bornecrantz * 56e61d062093a71e267aed02870607fc5a0d7d8f4Jakob Bornecrantz * Permission is hereby granted, free of charge, to any person obtaining a 66e61d062093a71e267aed02870607fc5a0d7d8f4Jakob Bornecrantz * copy of this software and associated documentation files (the "Software"), 76e61d062093a71e267aed02870607fc5a0d7d8f4Jakob Bornecrantz * to deal in the Software without restriction, including without limitation 86e61d062093a71e267aed02870607fc5a0d7d8f4Jakob Bornecrantz * the rights to use, copy, modify, merge, publish, distribute, sublicense, 96e61d062093a71e267aed02870607fc5a0d7d8f4Jakob Bornecrantz * and/or sell copies of the Software, and to permit persons to whom the 106e61d062093a71e267aed02870607fc5a0d7d8f4Jakob Bornecrantz * Software is furnished to do so, subject to the following conditions: 116e61d062093a71e267aed02870607fc5a0d7d8f4Jakob Bornecrantz * 126e61d062093a71e267aed02870607fc5a0d7d8f4Jakob Bornecrantz * The above copyright notice and this permission notice (including the next 136e61d062093a71e267aed02870607fc5a0d7d8f4Jakob Bornecrantz * paragraph) shall be included in all copies or substantial portions of the 146e61d062093a71e267aed02870607fc5a0d7d8f4Jakob Bornecrantz * Software. 156e61d062093a71e267aed02870607fc5a0d7d8f4Jakob Bornecrantz * 166e61d062093a71e267aed02870607fc5a0d7d8f4Jakob Bornecrantz * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 176e61d062093a71e267aed02870607fc5a0d7d8f4Jakob Bornecrantz * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 186e61d062093a71e267aed02870607fc5a0d7d8f4Jakob Bornecrantz * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 196e61d062093a71e267aed02870607fc5a0d7d8f4Jakob Bornecrantz * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 206e61d062093a71e267aed02870607fc5a0d7d8f4Jakob Bornecrantz * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 216e61d062093a71e267aed02870607fc5a0d7d8f4Jakob Bornecrantz * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 226e61d062093a71e267aed02870607fc5a0d7d8f4Jakob Bornecrantz * DEALINGS IN THE SOFTWARE. 236e61d062093a71e267aed02870607fc5a0d7d8f4Jakob Bornecrantz * 246e61d062093a71e267aed02870607fc5a0d7d8f4Jakob Bornecrantz **************************************************************************/ 256e61d062093a71e267aed02870607fc5a0d7d8f4Jakob Bornecrantz 266e61d062093a71e267aed02870607fc5a0d7d8f4Jakob Bornecrantz#ifndef U_FIFO_H 276e61d062093a71e267aed02870607fc5a0d7d8f4Jakob Bornecrantz#define U_FIFO_H 286e61d062093a71e267aed02870607fc5a0d7d8f4Jakob Bornecrantz 296e61d062093a71e267aed02870607fc5a0d7d8f4Jakob Bornecrantz#include "util/u_memory.h" 306e61d062093a71e267aed02870607fc5a0d7d8f4Jakob Bornecrantz 316e61d062093a71e267aed02870607fc5a0d7d8f4Jakob Bornecrantzstruct util_fifo 326e61d062093a71e267aed02870607fc5a0d7d8f4Jakob Bornecrantz{ 336e61d062093a71e267aed02870607fc5a0d7d8f4Jakob Bornecrantz size_t head; 346e61d062093a71e267aed02870607fc5a0d7d8f4Jakob Bornecrantz size_t tail; 356e61d062093a71e267aed02870607fc5a0d7d8f4Jakob Bornecrantz size_t num; 366e61d062093a71e267aed02870607fc5a0d7d8f4Jakob Bornecrantz size_t size; 376e61d062093a71e267aed02870607fc5a0d7d8f4Jakob Bornecrantz}; 386e61d062093a71e267aed02870607fc5a0d7d8f4Jakob Bornecrantz 396e61d062093a71e267aed02870607fc5a0d7d8f4Jakob Bornecrantzstatic INLINE struct util_fifo * 406e61d062093a71e267aed02870607fc5a0d7d8f4Jakob Bornecrantzu_fifo_create(size_t size) 416e61d062093a71e267aed02870607fc5a0d7d8f4Jakob Bornecrantz{ 426e61d062093a71e267aed02870607fc5a0d7d8f4Jakob Bornecrantz struct util_fifo *fifo; 436e61d062093a71e267aed02870607fc5a0d7d8f4Jakob Bornecrantz fifo = MALLOC(sizeof(*fifo) + size * sizeof(void*)); 446e61d062093a71e267aed02870607fc5a0d7d8f4Jakob Bornecrantz 456e61d062093a71e267aed02870607fc5a0d7d8f4Jakob Bornecrantz fifo->head = 0; 466e61d062093a71e267aed02870607fc5a0d7d8f4Jakob Bornecrantz fifo->tail = 0; 476e61d062093a71e267aed02870607fc5a0d7d8f4Jakob Bornecrantz fifo->num = 0; 486e61d062093a71e267aed02870607fc5a0d7d8f4Jakob Bornecrantz fifo->size = size; 496e61d062093a71e267aed02870607fc5a0d7d8f4Jakob Bornecrantz 506e61d062093a71e267aed02870607fc5a0d7d8f4Jakob Bornecrantz return fifo; 516e61d062093a71e267aed02870607fc5a0d7d8f4Jakob Bornecrantz} 526e61d062093a71e267aed02870607fc5a0d7d8f4Jakob Bornecrantz 536e61d062093a71e267aed02870607fc5a0d7d8f4Jakob Bornecrantzstatic INLINE boolean 546e61d062093a71e267aed02870607fc5a0d7d8f4Jakob Bornecrantzu_fifo_add(struct util_fifo *fifo, void *ptr) 556e61d062093a71e267aed02870607fc5a0d7d8f4Jakob Bornecrantz{ 566e61d062093a71e267aed02870607fc5a0d7d8f4Jakob Bornecrantz void **array = (void**)&fifo[1]; 576e61d062093a71e267aed02870607fc5a0d7d8f4Jakob Bornecrantz if (fifo->num >= fifo->size) 586e61d062093a71e267aed02870607fc5a0d7d8f4Jakob Bornecrantz return FALSE; 596e61d062093a71e267aed02870607fc5a0d7d8f4Jakob Bornecrantz 606e61d062093a71e267aed02870607fc5a0d7d8f4Jakob Bornecrantz if (++fifo->head >= fifo->size) 616e61d062093a71e267aed02870607fc5a0d7d8f4Jakob Bornecrantz fifo->head = 0; 626e61d062093a71e267aed02870607fc5a0d7d8f4Jakob Bornecrantz 636e61d062093a71e267aed02870607fc5a0d7d8f4Jakob Bornecrantz array[fifo->head] = ptr; 646e61d062093a71e267aed02870607fc5a0d7d8f4Jakob Bornecrantz 656e61d062093a71e267aed02870607fc5a0d7d8f4Jakob Bornecrantz ++fifo->num; 666e61d062093a71e267aed02870607fc5a0d7d8f4Jakob Bornecrantz 676e61d062093a71e267aed02870607fc5a0d7d8f4Jakob Bornecrantz return TRUE; 686e61d062093a71e267aed02870607fc5a0d7d8f4Jakob Bornecrantz} 696e61d062093a71e267aed02870607fc5a0d7d8f4Jakob Bornecrantz 706e61d062093a71e267aed02870607fc5a0d7d8f4Jakob Bornecrantzstatic INLINE boolean 716e61d062093a71e267aed02870607fc5a0d7d8f4Jakob Bornecrantzu_fifo_pop(struct util_fifo *fifo, void **ptr) 726e61d062093a71e267aed02870607fc5a0d7d8f4Jakob Bornecrantz{ 736e61d062093a71e267aed02870607fc5a0d7d8f4Jakob Bornecrantz void **array = (void**)&fifo[1]; 746e61d062093a71e267aed02870607fc5a0d7d8f4Jakob Bornecrantz 756e61d062093a71e267aed02870607fc5a0d7d8f4Jakob Bornecrantz if (!fifo->num) 766e61d062093a71e267aed02870607fc5a0d7d8f4Jakob Bornecrantz return FALSE; 776e61d062093a71e267aed02870607fc5a0d7d8f4Jakob Bornecrantz 786e61d062093a71e267aed02870607fc5a0d7d8f4Jakob Bornecrantz if (++fifo->tail >= fifo->size) 796e61d062093a71e267aed02870607fc5a0d7d8f4Jakob Bornecrantz fifo->tail = 0; 806e61d062093a71e267aed02870607fc5a0d7d8f4Jakob Bornecrantz 816e61d062093a71e267aed02870607fc5a0d7d8f4Jakob Bornecrantz *ptr = array[fifo->tail]; 826e61d062093a71e267aed02870607fc5a0d7d8f4Jakob Bornecrantz 836e61d062093a71e267aed02870607fc5a0d7d8f4Jakob Bornecrantz ++fifo->num; 846e61d062093a71e267aed02870607fc5a0d7d8f4Jakob Bornecrantz 856e61d062093a71e267aed02870607fc5a0d7d8f4Jakob Bornecrantz return TRUE; 866e61d062093a71e267aed02870607fc5a0d7d8f4Jakob Bornecrantz} 876e61d062093a71e267aed02870607fc5a0d7d8f4Jakob Bornecrantz 886e61d062093a71e267aed02870607fc5a0d7d8f4Jakob Bornecrantzstatic INLINE void 896e61d062093a71e267aed02870607fc5a0d7d8f4Jakob Bornecrantzu_fifo_destroy(struct util_fifo *fifo) 906e61d062093a71e267aed02870607fc5a0d7d8f4Jakob Bornecrantz{ 916e61d062093a71e267aed02870607fc5a0d7d8f4Jakob Bornecrantz FREE(fifo); 926e61d062093a71e267aed02870607fc5a0d7d8f4Jakob Bornecrantz} 936e61d062093a71e267aed02870607fc5a0d7d8f4Jakob Bornecrantz 946e61d062093a71e267aed02870607fc5a0d7d8f4Jakob Bornecrantz#endif 95