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