xref: /linux-6.15/include/linux/circ_buf.h (revision 5fb94e9c)
1b2441318SGreg Kroah-Hartman /* SPDX-License-Identifier: GPL-2.0 */
290fddabfSDavid Howells /*
3*5fb94e9cSMauro Carvalho Chehab  * See Documentation/core-api/circular-buffers.rst for more information.
490fddabfSDavid Howells  */
590fddabfSDavid Howells 
61da177e4SLinus Torvalds #ifndef _LINUX_CIRC_BUF_H
71da177e4SLinus Torvalds #define _LINUX_CIRC_BUF_H 1
81da177e4SLinus Torvalds 
91da177e4SLinus Torvalds struct circ_buf {
101da177e4SLinus Torvalds 	char *buf;
111da177e4SLinus Torvalds 	int head;
121da177e4SLinus Torvalds 	int tail;
131da177e4SLinus Torvalds };
141da177e4SLinus Torvalds 
151da177e4SLinus Torvalds /* Return count in buffer.  */
161da177e4SLinus Torvalds #define CIRC_CNT(head,tail,size) (((head) - (tail)) & ((size)-1))
171da177e4SLinus Torvalds 
181da177e4SLinus Torvalds /* Return space available, 0..size-1.  We always leave one free char
191da177e4SLinus Torvalds    as a completely full buffer has head == tail, which is the same as
201da177e4SLinus Torvalds    empty.  */
211da177e4SLinus Torvalds #define CIRC_SPACE(head,tail,size) CIRC_CNT((tail),((head)+1),(size))
221da177e4SLinus Torvalds 
231da177e4SLinus Torvalds /* Return count up to the end of the buffer.  Carefully avoid
241da177e4SLinus Torvalds    accessing head and tail more than once, so they can change
251da177e4SLinus Torvalds    underneath us without returning inconsistent results.  */
261da177e4SLinus Torvalds #define CIRC_CNT_TO_END(head,tail,size) \
271da177e4SLinus Torvalds 	({int end = (size) - (tail); \
281da177e4SLinus Torvalds 	  int n = ((head) + end) & ((size)-1); \
291da177e4SLinus Torvalds 	  n < end ? n : end;})
301da177e4SLinus Torvalds 
311da177e4SLinus Torvalds /* Return space available up to the end of the buffer.  */
321da177e4SLinus Torvalds #define CIRC_SPACE_TO_END(head,tail,size) \
331da177e4SLinus Torvalds 	({int end = (size) - 1 - (head); \
341da177e4SLinus Torvalds 	  int n = (end + (tail)) & ((size)-1); \
351da177e4SLinus Torvalds 	  n <= end ? n : end+1;})
361da177e4SLinus Torvalds 
371da177e4SLinus Torvalds #endif /* _LINUX_CIRC_BUF_H  */
38