Files
CPP_Core/Core/Base/SM_RingBuffer.h
T
2026-06-25 15:44:25 +08:00

58 lines
1.6 KiB
C++

#ifndef PLANTSUNCAT_SM_BLOCK_RINGBUFFER_H
#define PLANTSUNCAT_SM_BLOCK_RINGBUFFER_H
#include "../Shared_Memory/Shared_Memory.h"
namespace Psc {
class SM_Base_RingBuffer {
public:
struct SharedMemoryState {
alignas(64) size_t capacity;
alignas(64) size_t head;
alignas(64) size_t tail;
};
void init(const std::string &name, size_t size);
SM_Base_RingBuffer();
SM_Base_RingBuffer(const std::string &name, size_t alloc_size);
[[nodiscard]] bool empty() const;
[[nodiscard]] bool full() const;
~SM_Base_RingBuffer();
Shared_Memory shm;
std::string state_str();
protected:
SharedMemoryState *state{};
uint8_t *buffer{};
size_t mask{};
Cross_Process_Mutex data_mutex;
Cross_Process_Mutex create_mutex;
bool create = false;
[[nodiscard]] size_t used_space() const;
[[nodiscard]] size_t free_space() const;
void rollback(size_t n);
void write_bytes(const uint8_t *data, size_t len);
void read_bytes(uint8_t *data, size_t len);
void peek_bytes(uint8_t *data, size_t len) const;
};
// 包模式读取数据
class SM_RingBuffer : public SM_Base_RingBuffer {
public:
static constexpr size_t HEADER_SIZE = sizeof(uint32_t);
bool write(const uint8_t *src, size_t len);
bool read(uint8_t *out, size_t &out_len);
};
// 流模式读取环境缓冲区
class SM_Stream_RingBuffer : public SM_Base_RingBuffer {
public:
bool write(const uint8_t *src, size_t len);
bool read(uint8_t *out, size_t &out_len);
size_t write_best_effort(const uint8_t *src, size_t len);
size_t read_best_effort(uint8_t *out, size_t max_len);
};
} // namespace Psc
#endif