]> git.sesse.net Git - bcachefs-tools-debian/blobdiff - libbcachefs/fifo.h
Update bcachefs sources to ff95156479
[bcachefs-tools-debian] / libbcachefs / fifo.h
index 2908ca239f39c262da4a720615a1fa077c2ccfc6..a391277e7b7a5717c99fafcd30847fa03002b150 100644 (file)
@@ -71,27 +71,33 @@ do {                                                                        \
 
 #define fifo_entry_idx(fifo, p)        (((p) - &fifo_peek_front(fifo)) & (fifo)->mask)
 
-#define fifo_push_back(fifo, i)                                                \
+#define fifo_push_back_ref(f)                                          \
+       (fifo_full((f)) ? NULL : &(f)->data[(f)->back++ & (f)->mask])
+
+#define fifo_push_front_ref(f)                                         \
+       (fifo_full((f)) ? NULL : &(f)->data[--(f)->front & (f)->mask])
+
+#define fifo_push_back(fifo, new)                                      \
 ({                                                                     \
-       bool _r = !fifo_full((fifo));                                   \
+       typeof((fifo)->data) _r = fifo_push_back_ref(fifo);             \
        if (_r)                                                         \
-               (fifo)->data[(fifo)->back++ & (fifo)->mask] = (i);      \
-       _r;                                                             \
+               *_r = (new);                                            \
+       _r != NULL;                                                     \
 })
 
-#define fifo_pop_front(fifo, i)                                                \
+#define fifo_push_front(fifo, new)                                     \
 ({                                                                     \
-       bool _r = !fifo_empty((fifo));                                  \
+       typeof((fifo)->data) _r = fifo_push_front_ref(fifo);            \
        if (_r)                                                         \
-               (i) = (fifo)->data[(fifo)->front++ & (fifo)->mask];     \
-       _r;                                                             \
+               *_r = (new);                                            \
+       _r != NULL;                                                     \
 })
 
-#define fifo_push_front(fifo, i)                                       \
+#define fifo_pop_front(fifo, i)                                                \
 ({                                                                     \
-       bool _r = !fifo_full((fifo));                                   \
+       bool _r = !fifo_empty((fifo));                                  \
        if (_r)                                                         \
-               (fifo)->data[--(fifo)->front & (fifo)->mask] = (i);     \
+               (i) = (fifo)->data[(fifo)->front++ & (fifo)->mask];     \
        _r;                                                             \
 })
 
@@ -103,6 +109,7 @@ do {                                                                        \
        _r;                                                             \
 })
 
+#define fifo_push_ref(fifo)    fifo_push_back_ref(fifo)
 #define fifo_push(fifo, i)     fifo_push_back(fifo, (i))
 #define fifo_pop(fifo, i)      fifo_pop_front(fifo, (i))
 #define fifo_peek(fifo)                fifo_peek_front(fifo)