Home | History | Annotate | Download | only in util
      1 /**************************************************************************
      2  *
      3  * Copyright  2009 Jakob Bornecrantz
      4  *
      5  * Permission is hereby granted, free of charge, to any person obtaining a
      6  * copy of this software and associated documentation files (the "Software"),
      7  * to deal in the Software without restriction, including without limitation
      8  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
      9  * and/or sell copies of the Software, and to permit persons to whom the
     10  * Software is furnished to do so, subject to the following conditions:
     11  *
     12  * The above copyright notice and this permission notice (including the next
     13  * paragraph) shall be included in all copies or substantial portions of the
     14  * Software.
     15  *
     16  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
     17  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
     18  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
     19  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
     20  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
     21  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
     22  * DEALINGS IN THE SOFTWARE.
     23  *
     24  **************************************************************************/
     25 
     26 #ifndef U_FIFO_H
     27 #define U_FIFO_H
     28 
     29 #include "util/u_memory.h"
     30 
     31 struct util_fifo
     32 {
     33    size_t head;
     34    size_t tail;
     35    size_t num;
     36    size_t size;
     37 };
     38 
     39 static inline struct util_fifo *
     40 u_fifo_create(size_t size)
     41 {
     42    struct util_fifo *fifo;
     43    fifo = MALLOC(sizeof(*fifo) + size * sizeof(void*));
     44 
     45    fifo->head = 0;
     46    fifo->tail = 0;
     47    fifo->num = 0;
     48    fifo->size = size;
     49 
     50    return fifo;
     51 }
     52 
     53 static inline boolean
     54 u_fifo_add(struct util_fifo *fifo, void *ptr)
     55 {
     56    void **array = (void**)&fifo[1];
     57    if (fifo->num >= fifo->size)
     58       return FALSE;
     59 
     60    if (++fifo->head >= fifo->size)
     61       fifo->head = 0;
     62 
     63    array[fifo->head] = ptr;
     64 
     65    ++fifo->num;
     66 
     67    return TRUE;
     68 }
     69 
     70 static inline boolean
     71 u_fifo_pop(struct util_fifo *fifo, void **ptr)
     72 {
     73    void **array = (void**)&fifo[1];
     74 
     75    if (!fifo->num)
     76       return FALSE;
     77 
     78    if (++fifo->tail >= fifo->size)
     79       fifo->tail = 0;
     80 
     81    *ptr = array[fifo->tail];
     82 
     83    ++fifo->num;
     84 
     85    return TRUE;
     86 }
     87 
     88 static inline void
     89 u_fifo_destroy(struct util_fifo *fifo)
     90 {
     91    FREE(fifo);
     92 }
     93 
     94 #endif
     95