diff options
Diffstat (limited to 'libbcachefs/fifo.h')
-rw-r--r-- | libbcachefs/fifo.h | 29 |
1 files changed, 18 insertions, 11 deletions
diff --git a/libbcachefs/fifo.h b/libbcachefs/fifo.h index 2908ca23..a391277e 100644 --- a/libbcachefs/fifo.h +++ b/libbcachefs/fifo.h @@ -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) |