59 lines
1.6 KiB
C++
59 lines
1.6 KiB
C++
#ifndef PLANTSUNCAT_SM_BLOCK_RINGBUFFER_H
|
|
#define PLANTSUNCAT_SM_BLOCK_RINGBUFFER_H
|
|
#include "../Shared_Memory/Shared_Memory.h"
|
|
#include <string_view>
|
|
|
|
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(std::string_view name, size_t size);
|
|
SM_Base_RingBuffer();
|
|
SM_Base_RingBuffer(std::string_view 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
|