Add support for Ceph Rados benchmarking.
[fio.git] / io_u_queue.h
1 #ifndef FIO_IO_U_QUEUE
2 #define FIO_IO_U_QUEUE
3
4 #include <assert.h>
5 #include "lib/types.h"
6
7 struct io_u;
8
9 struct io_u_queue {
10         struct io_u **io_us;
11         unsigned int nr;
12         unsigned int max;
13 };
14
15 static inline struct io_u *io_u_qpop(struct io_u_queue *q)
16 {
17         if (q->nr) {
18                 const unsigned int next = --q->nr;
19                 struct io_u *io_u = q->io_us[next];
20
21                 q->io_us[next] = NULL;
22                 return io_u;
23         }
24
25         return NULL;
26 }
27
28 static inline void io_u_qpush(struct io_u_queue *q, struct io_u *io_u)
29 {
30         if (q->nr < q->max) {
31                 q->io_us[q->nr++] = io_u;
32                 return;
33         }
34
35         assert(0);
36 }
37
38 static inline int io_u_qempty(const struct io_u_queue *q)
39 {
40         return !q->nr;
41 }
42
43 #define io_u_qiter(q, io_u, i)  \
44         for (i = 0; i < (q)->nr && (io_u = (q)->io_us[i]); i++)
45
46 bool io_u_qinit(struct io_u_queue *q, unsigned int nr);
47 void io_u_qexit(struct io_u_queue *q);
48
49 struct io_u_ring {
50         unsigned int head;
51         unsigned int tail;
52         unsigned int max;
53         struct io_u **ring;
54 };
55
56 bool io_u_rinit(struct io_u_ring *ring, unsigned int nr);
57 void io_u_rexit(struct io_u_ring *ring);
58
59 static inline void io_u_rpush(struct io_u_ring *r, struct io_u *io_u)
60 {
61         if (r->head + 1 != r->tail) {
62                 r->ring[r->head] = io_u;
63                 r->head = (r->head + 1) & (r->max - 1);
64                 return;
65         }
66
67         assert(0);
68 }
69
70 static inline struct io_u *io_u_rpop(struct io_u_ring *r)
71 {
72         if (r->head != r->tail) {
73                 struct io_u *io_u = r->ring[r->tail];
74
75                 r->tail = (r->tail + 1) & (r->max - 1);
76                 return io_u;
77         }
78
79         return NULL;
80 }
81
82 static inline int io_u_rempty(struct io_u_ring *ring)
83 {
84         return ring->head == ring->tail;
85 }
86
87 #endif