Split direction and size params

This commit is contained in:
Alex Kotov 2020-12-13 17:52:10 +05:00
parent 2ecfe0ea6f
commit cb09c01611
Signed by: kotovalexarian
GPG Key ID: 553C0EBBEB5D5F08
2 changed files with 30 additions and 17 deletions

View File

@ -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
}

View File

@ -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,