mirror of https://github.com/tailix/libshmemq.git
Split direction and size params
This commit is contained in:
parent
2ecfe0ea6f
commit
cb09c01611
|
@ -7,8 +7,12 @@
|
|||
#define SHMEMQ_NAME_SIZE_MAX ((size_t)255)
|
||||
#define SHMEMQ_NAME_SLEN_MAX (SHMEMQ_NAME_SIZE_MAX - 1)
|
||||
|
||||
#define SHMEMQ_BUFFER_SIZE_MIN \
|
||||
(sizeof(struct Shmemq_BufferHeader) + SHMEMQ_FRAME_SIZE)
|
||||
#define SHMEMQ_BUFFER_FRAMES_COUNT_MIN 10
|
||||
|
||||
#define SHMEMQ_BUFFER_SIZE_MIN ( \
|
||||
sizeof(struct Shmemq_BufferHeader) + \
|
||||
SHMEMQ_BUFFER_FRAMES_COUNT_MIN * SHMEMQ_FRAME_SIZE \
|
||||
)
|
||||
|
||||
#define SHMEMQ_FRAME_SIZE ((size_t)8)
|
||||
|
||||
|
@ -59,11 +63,19 @@ struct Shmemq {
|
|||
struct Shmemq_Buffer *buffer;
|
||||
};
|
||||
|
||||
struct Shmemq*
|
||||
shmemq_new(const char *name, size_t size, enum Shmemq_Error *error_ptr);
|
||||
struct Shmemq *shmemq_new(
|
||||
const char *name,
|
||||
bool is_consumer,
|
||||
size_t size,
|
||||
enum Shmemq_Error *error_ptr
|
||||
);
|
||||
|
||||
enum Shmemq_Error
|
||||
shmemq_init(struct Shmemq *shmemq, const char *name, size_t size);
|
||||
enum Shmemq_Error shmemq_init(
|
||||
struct Shmemq *shmemq,
|
||||
const char *name,
|
||||
bool is_consumer,
|
||||
size_t size
|
||||
);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
|
23
src/main.c
23
src/main.c
|
@ -15,6 +15,7 @@
|
|||
|
||||
struct Shmemq *shmemq_new(
|
||||
const char *const name,
|
||||
const bool is_consumer,
|
||||
const size_t size,
|
||||
enum Shmemq_Error *const error_ptr
|
||||
) {
|
||||
|
@ -25,7 +26,8 @@ struct Shmemq *shmemq_new(
|
|||
return NULL;
|
||||
}
|
||||
|
||||
const enum Shmemq_Error error = shmemq_init(shmemq, name, size);
|
||||
const enum Shmemq_Error error =
|
||||
shmemq_init(shmemq, name, is_consumer, size);
|
||||
|
||||
if (error_ptr) *error_ptr = error;
|
||||
|
||||
|
@ -40,7 +42,8 @@ struct Shmemq *shmemq_new(
|
|||
enum Shmemq_Error shmemq_init(
|
||||
struct Shmemq *const shmemq,
|
||||
const char *const name,
|
||||
const size_t size
|
||||
const bool is_consumer,
|
||||
size_t size
|
||||
) {
|
||||
if (strlen(name) > SHMEMQ_NAME_SLEN_MAX || name[0] != '/') {
|
||||
return SHMEMQ_ERROR_INVALID_NAME;
|
||||
|
@ -52,11 +55,11 @@ enum Shmemq_Error shmemq_init(
|
|||
|
||||
strcpy(shmemq->name, name);
|
||||
|
||||
if (size != 0 && size < SHMEMQ_BUFFER_SIZE_MIN) {
|
||||
return SHMEMQ_ERROR_INVALID_SIZE;
|
||||
}
|
||||
if (size == 0) size = SHMEMQ_BUFFER_FRAMES_COUNT_MIN;
|
||||
|
||||
shmemq->is_consumer = size == 0;
|
||||
if (size < SHMEMQ_BUFFER_SIZE_MIN) return SHMEMQ_ERROR_INVALID_SIZE;
|
||||
|
||||
shmemq->is_consumer = is_consumer;
|
||||
|
||||
shmemq->shm_id = shm_open(
|
||||
shmemq->name,
|
||||
|
@ -73,10 +76,8 @@ enum Shmemq_Error shmemq_init(
|
|||
return SHMEMQ_ERROR_FAILED_FSTAT;
|
||||
}
|
||||
|
||||
const size_t min_size = size == 0 ? SHMEMQ_BUFFER_SIZE_MIN : size;
|
||||
|
||||
if ((size_t)statbuf.st_size < min_size) {
|
||||
if (ftruncate(shmemq->shm_id, min_size) != 0) {
|
||||
if ((size_t)statbuf.st_size < size) {
|
||||
if (ftruncate(shmemq->shm_id, size) != 0) {
|
||||
shm_unlink(shmemq->name);
|
||||
return SHMEMQ_ERROR_FAILED_FTRUNCATE;
|
||||
}
|
||||
|
@ -84,7 +85,7 @@ enum Shmemq_Error shmemq_init(
|
|||
|
||||
shmemq->buffer = mmap(
|
||||
NULL,
|
||||
min_size,
|
||||
size,
|
||||
PROT_READ | PROT_WRITE,
|
||||
MAP_SHARED,
|
||||
shmemq->shm_id,
|
||||
|
|
Loading…
Reference in New Issue