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