1/*
2 * Copyright (C) 2020-2022 The opuntiaOS Project Authors.
3 * + Contributed by Nikita Melekhin <nimelehin@gmail.com>
4 *
5 * Use of this source code is governed by a BSD-style license that can be
6 * found in the LICENSE file.
7 */
8
9#ifndef _KERNEL_ALGO_RINGBUFFER_H
10#define _KERNEL_ALGO_RINGBUFFER_H
11
12#include <libkern/libkern.h>
13#include <libkern/lock.h>
14#include <mem/kmemzone.h>
15
16#define RINGBUFFER_STD_SIZE (16 * KB)
17
18struct __ringbuffer {
19 kmemzone_t zone;
20 size_t start;
21 size_t end;
22};
23typedef struct __ringbuffer ringbuffer_t;
24
25ringbuffer_t ringbuffer_create(size_t size);
26#define ringbuffer_create_std() ringbuffer_create(RINGBUFFER_STD_SIZE)
27void ringbuffer_free(ringbuffer_t* buf);
28
29size_t ringbuffer_space_to_read(ringbuffer_t* buf);
30size_t ringbuffer_space_to_read_with_custom_start(ringbuffer_t* buf, size_t start);
31size_t ringbuffer_space_to_write(ringbuffer_t* buf);
32size_t ringbuffer_read(ringbuffer_t* buf, uint8_t*, size_t);
33size_t ringbuffer_read_with_start(ringbuffer_t* buf, size_t start, uint8_t* holder, size_t siz);
34size_t ringbuffer_write(ringbuffer_t* buf, const uint8_t*, size_t);
35size_t ringbuffer_write_ignore_bounds(ringbuffer_t* buf, const uint8_t* holder, size_t siz);
36size_t ringbuffer_read_one(ringbuffer_t* buf, uint8_t* data);
37size_t ringbuffer_write_one(ringbuffer_t* buf, uint8_t data);
38void ringbuffer_clear(ringbuffer_t* buf);
39
40#endif //_KERNEL_ALGO_RINGBUFFER_H