libshmemq/include/shmemq.h

87 lines
1.8 KiB
C
Raw Normal View History

2020-12-13 09:15:45 +00:00
#ifndef SHMEMQ_INCLUDED
#define SHMEMQ_INCLUDED 1
#include <stdbool.h>
2020-12-13 09:15:45 +00:00
#include <stddef.h>
2020-12-13 09:44:03 +00:00
#define SHMEMQ_NAME_SIZE_MAX ((size_t)255)
2020-12-13 11:25:53 +00:00
#define SHMEMQ_NAME_SLEN_MAX (SHMEMQ_NAME_SIZE_MAX - 1)
2020-12-13 09:44:03 +00:00
2020-12-13 15:45:07 +00:00
// TODO: Resize buffer dynamically.
// #define SHMEMQ_BUFFER_SIZE_MIN (sizeof(struct Shmemq_BufferHeader))
2020-12-13 17:39:02 +00:00
#define SHMEMQ_BUFFER_SIZE_MIN (sizeof(struct ShmemqBufferHeader) + 800)
2020-12-13 12:19:46 +00:00
2020-12-13 09:15:45 +00:00
#define SHMEMQ_FRAME_SIZE ((size_t)8)
#define SHMEMQ_FRAME_DATA_SIZE \
2020-12-13 17:39:02 +00:00
(SHMEMQ_FRAME_SIZE - sizeof(struct ShmemqFrameHeader))
2020-12-13 09:15:45 +00:00
#ifdef __cplusplus
extern "C" {
#endif
2020-12-13 17:39:02 +00:00
enum ShmemqError {
SHMEMQ_ERROR_NONE = 0,
2020-12-13 12:17:47 +00:00
SHMEMQ_ERROR_INVALID_NAME = 1,
SHMEMQ_ERROR_FAILED_MALLOC = 255,
SHMEMQ_ERROR_FAILED_SHM_OPEN = 254,
SHMEMQ_ERROR_FAILED_FTRUNCATE = 253,
SHMEMQ_ERROR_FAILED_MMAP = 252,
SHMEMQ_ERROR_FAILED_MUNMAP = 251,
SHMEMQ_ERROR_FAILED_CLOSE = 250,
SHMEMQ_ERROR_FAILED_SHM_UNLINK = 249,
};
2020-12-13 17:39:02 +00:00
struct ShmemqFrameHeader {
2020-12-13 09:15:45 +00:00
size_t frame_size;
};
2020-12-13 17:39:02 +00:00
struct ShmemqFrame {
struct ShmemqFrameHeader header;
2020-12-13 09:15:45 +00:00
unsigned char data[SHMEMQ_FRAME_DATA_SIZE];
};
2020-12-13 17:39:02 +00:00
struct ShmemqBufferHeader {
2020-12-13 14:56:14 +00:00
bool is_ready;
2020-12-13 09:15:45 +00:00
size_t frames_count;
size_t read_frame_index;
size_t write_frame_index;
};
2020-12-13 17:39:02 +00:00
struct ShmemqBuffer {
struct ShmemqBufferHeader header;
struct ShmemqFrame frames[];
2020-12-13 09:15:45 +00:00
};
2020-12-13 15:04:20 +00:00
typedef struct Shmemq {
2020-12-13 09:44:03 +00:00
char name[SHMEMQ_NAME_SIZE_MAX];
bool is_consumer;
2020-12-13 11:32:17 +00:00
int shm_id;
2020-12-13 17:39:02 +00:00
struct ShmemqBuffer *buffer;
2020-12-13 15:04:20 +00:00
} *Shmemq;
2020-12-13 09:44:03 +00:00
2020-12-13 15:51:28 +00:00
Shmemq shmemq_new(
2020-12-13 12:52:10 +00:00
const char *name,
bool is_consumer,
2020-12-13 17:39:02 +00:00
enum ShmemqError *error_ptr
2020-12-13 12:52:10 +00:00
);
2020-12-13 17:33:08 +00:00
void shmemq_init(
2020-12-13 15:51:28 +00:00
Shmemq shmemq,
2020-12-13 12:52:10 +00:00
const char *name,
2020-12-13 17:33:08 +00:00
bool is_consumer,
2020-12-13 17:39:02 +00:00
enum ShmemqError *error_ptr
2020-12-13 12:52:10 +00:00
);
2020-12-13 17:39:02 +00:00
void shmemq_delete(Shmemq shmemq, enum ShmemqError *error_ptr);
2020-12-13 17:39:02 +00:00
void shmemq_finish(Shmemq shmemq, enum ShmemqError *error_ptr);
2020-12-13 09:15:45 +00:00
#ifdef __cplusplus
}
#endif
#endif