Bump version to 0.3.5next
[archipelago] / xseg / xtypes / xq.h
1 /*
2  * Copyright 2012 GRNET S.A. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or
5  * without modification, are permitted provided that the following
6  * conditions are met:
7  *
8  *   1. Redistributions of source code must retain the above
9  *      copyright notice, this list of conditions and the following
10  *      disclaimer.
11  *   2. Redistributions in binary form must reproduce the above
12  *      copyright notice, this list of conditions and the following
13  *      disclaimer in the documentation and/or other materials
14  *      provided with the distribution.
15  *
16  * THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
17  * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
20  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
23  * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
24  * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
26  * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27  * POSSIBILITY OF SUCH DAMAGE.
28  *
29  * The views and conclusions contained in the software and
30  * documentation are those of the authors and should not be
31  * interpreted as representing official policies, either expressed
32  * or implied, of GRNET S.A.
33  */
34
35 #ifndef _XQ_H
36 #define _XQ_H
37
38 #include <sys/util.h>
39
40 typedef uint64_t xqindex;
41
42 #include "xlock.h"
43
44 struct xq {
45         struct xlock lock;
46         xqindex head, tail;
47         XPTR_TYPE(xqindex) queue;
48         xqindex size;
49 };
50
51 xqindex    * xq_alloc_empty  ( struct xq  * xq,
52                                xqindex      size );
53
54 void         xq_init_empty   ( struct xq  * xq,
55                                xqindex      size,
56                                void       * mem );
57
58 xqindex    * xq_alloc_map    ( struct xq  * xq,
59                                xqindex      size,
60                                xqindex      count,
61                                xqindex   (* mapfn ) (xqindex) );
62
63 void         xq_init_map     ( struct xq  * xq,
64                                xqindex      size,
65                                xqindex      count,
66                                xqindex   (* mapfn ) (xqindex),
67                                void       * mem );
68
69 xqindex    * xq_alloc_seq    ( struct xq  * xq,
70                                xqindex      size,
71                                xqindex      count );
72
73 void         xq_init_seq     ( struct xq  * xq,
74                                xqindex      size,
75                                xqindex      count,
76                                void       * mem );
77
78 void         xq_free         ( struct xq  * xq  );
79
80 xqindex      __xq_append_head( struct xq  * xq,
81                                xqindex      xqi );
82
83 xqindex      xq_append_head  ( struct xq  * xq,
84                                xqindex      xqi,
85                                unsigned long who);
86
87 xqindex      __xq_pop_head   ( struct xq  * xq  );
88 xqindex      xq_pop_head     ( struct xq  * xq,
89                                unsigned long who);
90
91 xqindex      __xq_append_tail( struct xq  * xq,
92                                xqindex      xqi );
93
94 xqindex      xq_append_tail  ( struct xq  * xq,
95                                xqindex      xqi,
96                                unsigned long who);
97
98
99 xqindex      __xq_peek_head    ( struct xq  * xq);
100
101 xqindex      xq_peek_head    ( struct xq  * xq,
102                                unsigned long who);
103
104 xqindex      __xq_peek_tail    ( struct xq  * xq);
105
106 xqindex      xq_peek_tail    ( struct xq  * xq,
107                                unsigned long who);
108
109 xqindex      __xq_pop_tail   ( struct xq  * xq  );
110
111 xqindex      xq_pop_tail     ( struct xq  * xq,
112                                unsigned long who);
113
114 int          xq_head_to_tail ( struct xq  * hq,
115                                struct xq  * tq,
116                                xqindex      nr ,
117                                unsigned long who);
118
119 xqindex      xq_size         ( struct xq  * xq  );
120
121 xqindex      xq_count        ( struct xq  * xq  );
122
123 void         xq_print        ( struct xq  * xq  );
124
125 int          __xq_check      ( struct xq  * xq, 
126                                xqindex      idx );
127
128 int          xq_check        ( struct xq  * xq, 
129                                xqindex      idx,
130                                unsigned long who );
131
132 xqindex      __xq_resize     ( struct xq  * xq,
133                                struct xq  * newxq);
134
135 xqindex      xq_resize       ( struct xq  * xq,
136                                struct xq  * newxq,
137                                unsigned long who );
138 #endif
139