35 #ifndef CS_QUEUE_H_DEFINED 36 #define CS_QUEUE_H_DEFINED 59 cs_queue->
tail = cs_queue_items - 1;
62 cs_queue->
size = cs_queue_items;
66 cs_queue->
items = malloc (cs_queue_items * size_per_item);
67 if (cs_queue->
items == 0) {
70 memset (cs_queue->
items, 0, cs_queue_items * size_per_item);
72 pthread_mutex_init (&cs_queue->
mutex, NULL);
80 pthread_mutex_lock (&cs_queue->
mutex);
89 pthread_mutex_unlock (&cs_queue->
mutex);
94 static inline void cs_queue_free (
struct cs_queue *cs_queue) {
96 pthread_mutex_destroy (&cs_queue->
mutex);
98 free (cs_queue->
items);
101 static inline int cs_queue_is_full (
struct cs_queue *cs_queue) {
105 pthread_mutex_lock (&cs_queue->
mutex);
107 full = ((cs_queue->
size - 1) == cs_queue->
used);
109 pthread_mutex_unlock (&cs_queue->
mutex);
114 static inline int cs_queue_is_empty (
struct cs_queue *cs_queue) {
118 pthread_mutex_lock (&cs_queue->
mutex);
120 empty = (cs_queue->
used == 0);
122 pthread_mutex_unlock (&cs_queue->
mutex);
127 static inline void cs_queue_item_add (
struct cs_queue *cs_queue,
void *item)
130 int cs_queue_position;
133 pthread_mutex_lock (&cs_queue->
mutex);
135 cs_queue_position = cs_queue->
head;
136 cs_queue_item = cs_queue->
items;
137 cs_queue_item += cs_queue_position * cs_queue->
size_per_item;
140 assert (cs_queue->
tail != cs_queue->
head);
148 pthread_mutex_unlock (&cs_queue->
mutex);
152 static inline void *cs_queue_item_get (
struct cs_queue *cs_queue)
155 int cs_queue_position;
158 pthread_mutex_lock (&cs_queue->
mutex);
160 cs_queue_position = (cs_queue->
tail + 1) % cs_queue->
size;
161 cs_queue_item = cs_queue->
items;
162 cs_queue_item += cs_queue_position * cs_queue->
size_per_item;
164 pthread_mutex_unlock (&cs_queue->
mutex);
166 return ((
void *)cs_queue_item);
169 static inline void cs_queue_item_remove (
struct cs_queue *cs_queue) {
171 pthread_mutex_lock (&cs_queue->
mutex);
175 assert (cs_queue->
tail != cs_queue->
head);
178 assert (cs_queue->
used >= 0);
180 pthread_mutex_unlock (&cs_queue->
mutex);
184 static inline void cs_queue_items_remove (
struct cs_queue *cs_queue,
int rel_count)
187 pthread_mutex_lock (&cs_queue->
mutex);
189 cs_queue->
tail = (cs_queue->
tail + rel_count) % cs_queue->
size;
191 assert (cs_queue->
tail != cs_queue->
head);
193 cs_queue->
used -= rel_count;
195 pthread_mutex_unlock (&cs_queue->
mutex);
200 static inline void cs_queue_item_iterator_init (
struct cs_queue *cs_queue)
203 pthread_mutex_lock (&cs_queue->
mutex);
207 pthread_mutex_unlock (&cs_queue->
mutex);
211 static inline void *cs_queue_item_iterator_get (
struct cs_queue *cs_queue)
214 int cs_queue_position;
217 pthread_mutex_lock (&cs_queue->
mutex);
219 cs_queue_position = (cs_queue->
iterator) % cs_queue->
size;
222 pthread_mutex_unlock (&cs_queue->
mutex);
226 cs_queue_item = cs_queue->
items;
227 cs_queue_item += cs_queue_position * cs_queue->
size_per_item;
229 pthread_mutex_unlock (&cs_queue->
mutex);
231 return ((
void *)cs_queue_item);
234 static inline int cs_queue_item_iterator_next (
struct cs_queue *cs_queue)
239 pthread_mutex_lock (&cs_queue->
mutex);
245 pthread_mutex_unlock (&cs_queue->
mutex);
250 static inline void cs_queue_avail (
struct cs_queue *cs_queue,
int *avail)
253 pthread_mutex_lock (&cs_queue->
mutex);
255 *avail = cs_queue->
size - cs_queue->
used - 2;
256 assert (*avail >= 0);
258 pthread_mutex_unlock (&cs_queue->
mutex);
262 static inline int cs_queue_used (
struct cs_queue *cs_queue) {
266 pthread_mutex_lock (&cs_queue->
mutex);
268 used = cs_queue->
used;
270 pthread_mutex_unlock (&cs_queue->
mutex);
276 static inline int cs_queue_usedhw (
struct cs_queue *cs_queue) {
280 pthread_mutex_lock (&cs_queue->
mutex);
283 usedhw = cs_queue->
usedhw;
286 pthread_mutex_unlock (&cs_queue->
mutex);
int threaded_mode_enabled