summaryrefslogtreecommitdiff
path: root/libbcachefs/fifo.h
diff options
context:
space:
mode:
Diffstat (limited to 'libbcachefs/fifo.h')
-rw-r--r--libbcachefs/fifo.h11
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++)