libaio: don't call io_destroy(), let exit_aio() take care of it
[fio.git] / io_u_queue.h
index 4f6e8e6a703b573e8f5c0d3e24fa397e090008e2..118e59342b5da4bd814be51aa7f561d519603838 100644 (file)
@@ -8,28 +8,39 @@ struct io_u;
 struct io_u_queue {
        struct io_u **io_us;
        unsigned int nr;
+       unsigned int max;
 };
 
 static inline struct io_u *io_u_qpop(struct io_u_queue *q)
 {
-       if (q->nr)
-               return q->io_us[--q->nr];
+       if (q->nr) {
+               const unsigned int next = --q->nr;
+               struct io_u *io_u = q->io_us[next];
+
+               q->io_us[next] = NULL;
+               return io_u;
+       }
 
        return NULL;
 }
 
 static inline void io_u_qpush(struct io_u_queue *q, struct io_u *io_u)
 {
-       q->io_us[q->nr++] = io_u;
+       if (q->nr < q->max) {
+               q->io_us[q->nr++] = io_u;
+               return;
+       }
+
+       assert(0);
 }
 
-static inline int io_u_qempty(struct io_u_queue *q)
+static inline int io_u_qempty(const struct io_u_queue *q)
 {
        return !q->nr;
 }
 
 #define io_u_qiter(q, io_u, i) \
-       for (i = 0, io_u = (q)->io_us[0]; i < (q)->nr; i++, io_u = (q)->io_us[i])
+       for (i = 0; i < (q)->nr && (io_u = (q)->io_us[i]); i++)
 
 int io_u_qinit(struct io_u_queue *q, unsigned int nr);
 void io_u_qexit(struct io_u_queue *q);