diff options
Diffstat (limited to 'libbcachefs/fifo.h')
-rw-r--r-- | libbcachefs/fifo.h | 11 |
1 files changed, 9 insertions, 2 deletions
diff --git a/libbcachefs/fifo.h b/libbcachefs/fifo.h index 08739d26..789ae663 100644 --- a/libbcachefs/fifo.h +++ b/libbcachefs/fifo.h @@ -56,6 +56,11 @@ do { \ #define fifo_peek_front(fifo) ((fifo)->data[(fifo)->front & (fifo)->mask]) #define fifo_peek_back(fifo) ((fifo)->data[((fifo)->back - 1) & (fifo)->mask]) +#define fifo_entry_idx_abs(fifo, p) \ + ((((p) >= &fifo_peek_front(fifo) \ + ? (fifo)->front : (fifo)->back) & ~(fifo)->mask) + \ + (((p) - (fifo)->data))) + #define fifo_entry_idx(fifo, p) (((p) - &fifo_peek_front(fifo)) & (fifo)->mask) #define fifo_idx_entry(fifo, i) (fifo)->data[((fifo)->front + (i)) & (fifo)->mask] @@ -103,13 +108,15 @@ do { \ #define fifo_peek(fifo) fifo_peek_front(fifo) #define fifo_for_each_entry(_entry, _fifo, _iter) \ - for (_iter = (_fifo)->front; \ + for (((void) (&(_iter) == &(_fifo)->front)), \ + _iter = (_fifo)->front; \ ((_iter != (_fifo)->back) && \ (_entry = (_fifo)->data[(_iter) & (_fifo)->mask], true)); \ _iter++) #define fifo_for_each_entry_ptr(_ptr, _fifo, _iter) \ - for (_iter = (_fifo)->front; \ + for (((void) (&(_iter) == &(_fifo)->front)), \ + _iter = (_fifo)->front; \ ((_iter != (_fifo)->back) && \ (_ptr = &(_fifo)->data[(_iter) & (_fifo)->mask], true)); \ _iter++) |