Add Linux's circ_buf.h
authorBarret Rhoden <brho@cs.berkeley.edu>
Wed, 28 Aug 2019 20:23:54 +0000 (16:23 -0400)
committerBarret Rhoden <brho@cs.berkeley.edu>
Tue, 8 Oct 2019 21:11:10 +0000 (17:11 -0400)
From 5.2.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
kern/include/linux/circ_buf.h [new file with mode: 0644]

diff --git a/kern/include/linux/circ_buf.h b/kern/include/linux/circ_buf.h
new file mode 100644 (file)
index 0000000..b3233e8
--- /dev/null
@@ -0,0 +1,37 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * See Documentation/core-api/circular-buffers.rst for more information.
+ */
+
+#ifndef _LINUX_CIRC_BUF_H
+#define _LINUX_CIRC_BUF_H 1
+
+struct circ_buf {
+       char *buf;
+       int head;
+       int tail;
+};
+
+/* Return count in buffer.  */
+#define CIRC_CNT(head,tail,size) (((head) - (tail)) & ((size)-1))
+
+/* Return space available, 0..size-1.  We always leave one free char
+   as a completely full buffer has head == tail, which is the same as
+   empty.  */
+#define CIRC_SPACE(head,tail,size) CIRC_CNT((tail),((head)+1),(size))
+
+/* Return count up to the end of the buffer.  Carefully avoid
+   accessing head and tail more than once, so they can change
+   underneath us without returning inconsistent results.  */
+#define CIRC_CNT_TO_END(head,tail,size) \
+       ({int end = (size) - (tail); \
+         int n = ((head) + end) & ((size)-1); \
+         n < end ? n : end;})
+
+/* Return space available up to the end of the buffer.  */
+#define CIRC_SPACE_TO_END(head,tail,size) \
+       ({int end = (size) - 1 - (head); \
+         int n = (end + (tail)) & ((size)-1); \
+         n <= end ? n : end+1;})
+
+#endif /* _LINUX_CIRC_BUF_H  */