13a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org/************************************************************************** 23a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * 33a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * Copyright © 2009 Jakob Bornecrantz 43a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * 53a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * Permission is hereby granted, free of charge, to any person obtaining a 63a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * copy of this software and associated documentation files (the "Software"), 73a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * to deal in the Software without restriction, including without limitation 83a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * the rights to use, copy, modify, merge, publish, distribute, sublicense, 93a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * and/or sell copies of the Software, and to permit persons to whom the 103a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * Software is furnished to do so, subject to the following conditions: 113a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * 123a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * The above copyright notice and this permission notice (including the next 133a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * paragraph) shall be included in all copies or substantial portions of the 143a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * Software. 153a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * 163a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 173a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 183a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 193a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 203a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 213a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 223a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * DEALINGS IN THE SOFTWARE. 233a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * 243a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org **************************************************************************/ 253a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 263a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org#ifndef U_FIFO_H 273a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org#define U_FIFO_H 283a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 293a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org#include "util/u_memory.h" 303a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 313a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgstruct util_fifo 323a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{ 333a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org size_t head; 343a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org size_t tail; 353a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org size_t num; 363a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org size_t size; 373a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org}; 383a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 393a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgstatic INLINE struct util_fifo * 403a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgu_fifo_create(size_t size) 413a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{ 423a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org struct util_fifo *fifo; 433a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org fifo = MALLOC(sizeof(*fifo) + size * sizeof(void*)); 443a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 453a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org fifo->head = 0; 463a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org fifo->tail = 0; 473a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org fifo->num = 0; 483a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org fifo->size = size; 493a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 503a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org return fifo; 513a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org} 523a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 533a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgstatic INLINE boolean 543a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgu_fifo_add(struct util_fifo *fifo, void *ptr) 553a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{ 563a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org void **array = (void**)&fifo[1]; 573a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org if (fifo->num >= fifo->size) 583a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org return FALSE; 593a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 603a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org if (++fifo->head >= fifo->size) 613a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org fifo->head = 0; 623a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 633a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org array[fifo->head] = ptr; 643a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 653a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org ++fifo->num; 663a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 673a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org return TRUE; 683a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org} 693a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 703a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgstatic INLINE boolean 713a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgu_fifo_pop(struct util_fifo *fifo, void **ptr) 723a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{ 733a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org void **array = (void**)&fifo[1]; 743a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 753a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org if (!fifo->num) 763a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org return FALSE; 773a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 783a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org if (++fifo->tail >= fifo->size) 793a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org fifo->tail = 0; 803a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 813a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org *ptr = array[fifo->tail]; 823a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 833a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org ++fifo->num; 843a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 853a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org return TRUE; 863a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org} 873a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 883a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgstatic INLINE void 893a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgu_fifo_destroy(struct util_fifo *fifo) 903a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{ 913a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org FREE(fifo); 923a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org} 933a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 943a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org#endif 95