add archipelago-dbg package
[archipelago] / xseg / xtypes / xq.h
1 #ifndef _XQ_H
2 #define _XQ_H
3
4 #include <sys/util.h>
5
6 typedef uint64_t xqindex;
7
8 #include "xlock.h"
9
10 struct xq {
11         struct xlock lock;
12         xqindex head, tail;
13         XPTR_TYPE(xqindex) queue;
14         xqindex size;
15 };
16
17 xqindex    * xq_alloc_empty  ( struct xq  * xq,
18                                xqindex      size );
19
20 void         xq_init_empty   ( struct xq  * xq,
21                                xqindex      size,
22                                void       * mem );
23
24 xqindex    * xq_alloc_map    ( struct xq  * xq,
25                                xqindex      size,
26                                xqindex      count,
27                                xqindex   (* mapfn ) (xqindex) );
28
29 void         xq_init_map     ( struct xq  * xq,
30                                xqindex      size,
31                                xqindex      count,
32                                xqindex   (* mapfn ) (xqindex),
33                                void       * mem );
34
35 xqindex    * xq_alloc_seq    ( struct xq  * xq,
36                                xqindex      size,
37                                xqindex      count );
38
39 void         xq_init_seq     ( struct xq  * xq,
40                                xqindex      size,
41                                xqindex      count,
42                                void       * mem );
43
44 void         xq_free         ( struct xq  * xq  );
45
46 xqindex      __xq_append_head( struct xq  * xq,
47                                xqindex      xqi );
48
49 xqindex      xq_append_head  ( struct xq  * xq,
50                                xqindex      xqi,
51                                unsigned long who);
52
53 xqindex      __xq_pop_head   ( struct xq  * xq  );
54 xqindex      xq_pop_head     ( struct xq  * xq,
55                                unsigned long who);
56
57 xqindex      __xq_append_tail( struct xq  * xq,
58                                xqindex      xqi );
59
60 xqindex      xq_append_tail  ( struct xq  * xq,
61                                xqindex      xqi,
62                                unsigned long who);
63
64
65 xqindex      __xq_peek_head    ( struct xq  * xq);
66
67 xqindex      xq_peek_head    ( struct xq  * xq,
68                                unsigned long who);
69
70 xqindex      __xq_peek_tail    ( struct xq  * xq);
71
72 xqindex      xq_peek_tail    ( struct xq  * xq,
73                                unsigned long who);
74
75 xqindex      __xq_pop_tail   ( struct xq  * xq  );
76
77 xqindex      xq_pop_tail     ( struct xq  * xq,
78                                unsigned long who);
79
80 int          xq_head_to_tail ( struct xq  * hq,
81                                struct xq  * tq,
82                                xqindex      nr ,
83                                unsigned long who);
84
85 xqindex      xq_size         ( struct xq  * xq  );
86
87 xqindex      xq_count        ( struct xq  * xq  );
88
89 void         xq_print        ( struct xq  * xq  );
90
91 int          __xq_check      ( struct xq  * xq, 
92                                xqindex      idx );
93
94 int          xq_check        ( struct xq  * xq, 
95                                xqindex      idx,
96                                unsigned long who );
97
98 xqindex      __xq_resize     ( struct xq  * xq,
99                                struct xq  * newxq);
100
101 xqindex      xq_resize       ( struct xq  * xq,
102                                struct xq  * newxq,
103                                unsigned long who );
104 #endif
105