Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
PojavLauncherTeam
GitHub Repository: PojavLauncherTeam/mesa
Path: blob/21.2-virgl/src/gallium/auxiliary/util/u_fifo.h
4561 views
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
96