Initialize with default size

This commit is contained in:
Alex Kotov 2020-12-13 18:02:01 +05:00
parent 52e3fa3ba0
commit e4d35722d4
Signed by: kotovalexarian
GPG Key ID: 553C0EBBEB5D5F08
3 changed files with 10 additions and 40 deletions

View File

@ -39,7 +39,6 @@ AC_CHECK_HEADERS([sys/stat.h])
AC_CHECK_HEADERS([unistd.h])
AC_CHECK_FUNCS([ftruncate])
AC_CHECK_FUNCS([fstat])
AC_CHECK_FUNCS([munmap])
AC_CHECK_FUNCS([strcpy])
AC_CHECK_FUNCS([strlen])
@ -47,6 +46,4 @@ AC_CHECK_FUNCS([strlen])
AC_SEARCH_LIBS([shm_open], [rt])
AC_SEARCH_LIBS([shm_unlink], [rt])
AC_CHECK_MEMBER([struct stat.st_size], [], [], [#include <sys/stat.h>])
AC_OUTPUT

View File

@ -7,12 +7,7 @@
#define SHMEMQ_NAME_SIZE_MAX ((size_t)255)
#define SHMEMQ_NAME_SLEN_MAX (SHMEMQ_NAME_SIZE_MAX - 1)
#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_BUFFER_SIZE_MIN (sizeof(struct Shmemq_BufferHeader))
#define SHMEMQ_FRAME_SIZE ((size_t)8)
@ -27,13 +22,11 @@ enum Shmemq_Error {
SHMEMQ_ERROR_NONE = 0,
SHMEMQ_ERROR_INVALID_NAME = 1,
SHMEMQ_ERROR_INVALID_SIZE = 2,
SHMEMQ_ERROR_FAILED_MALLOC = 255,
SHMEMQ_ERROR_FAILED_SHM_OPEN = 254,
SHMEMQ_ERROR_FAILED_FSTAT = 253,
SHMEMQ_ERROR_FAILED_FTRUNCATE = 252,
SHMEMQ_ERROR_FAILED_MMAP = 251,
SHMEMQ_ERROR_FAILED_FTRUNCATE = 253,
SHMEMQ_ERROR_FAILED_MMAP = 252,
};
struct Shmemq_FrameHeader {
@ -66,15 +59,13 @@ struct Shmemq {
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,
bool is_consumer,
size_t size
bool is_consumer
);
#ifdef __cplusplus

View File

@ -16,7 +16,6 @@
struct Shmemq *shmemq_new(
const char *const name,
const bool is_consumer,
const size_t size,
enum Shmemq_Error *const error_ptr
) {
struct Shmemq *const shmemq = malloc(sizeof(*shmemq));
@ -26,8 +25,7 @@ struct Shmemq *shmemq_new(
return NULL;
}
const enum Shmemq_Error error =
shmemq_init(shmemq, name, is_consumer, size);
const enum Shmemq_Error error = shmemq_init(shmemq, name, is_consumer);
if (error_ptr) *error_ptr = error;
@ -42,8 +40,7 @@ struct Shmemq *shmemq_new(
enum Shmemq_Error shmemq_init(
struct Shmemq *const shmemq,
const char *const name,
const bool is_consumer,
size_t size
const bool is_consumer
) {
if (strlen(name) > SHMEMQ_NAME_SLEN_MAX || name[0] != '/') {
return SHMEMQ_ERROR_INVALID_NAME;
@ -55,10 +52,6 @@ enum Shmemq_Error shmemq_init(
strcpy(shmemq->name, name);
if (size == 0) size = SHMEMQ_BUFFER_FRAMES_COUNT_MIN;
if (size < SHMEMQ_BUFFER_SIZE_MIN) return SHMEMQ_ERROR_INVALID_SIZE;
shmemq->is_consumer = is_consumer;
shmemq->shm_id = shm_open(
@ -69,23 +62,14 @@ enum Shmemq_Error shmemq_init(
if (shmemq->shm_id == -1) return SHMEMQ_ERROR_FAILED_SHM_OPEN;
struct stat statbuf;
if (fstat(shmemq->shm_id, &statbuf) != 0 || statbuf.st_size < 0) {
if (ftruncate(shmemq->shm_id, SHMEMQ_BUFFER_SIZE_MIN) != 0) {
shm_unlink(shmemq->name);
return SHMEMQ_ERROR_FAILED_FSTAT;
}
if ((size_t)statbuf.st_size < size) {
if (ftruncate(shmemq->shm_id, size) != 0) {
shm_unlink(shmemq->name);
return SHMEMQ_ERROR_FAILED_FTRUNCATE;
}
return SHMEMQ_ERROR_FAILED_FTRUNCATE;
}
shmemq->buffer = mmap(
NULL,
size,
SHMEMQ_BUFFER_SIZE_MIN,
PROT_READ | PROT_WRITE,
MAP_SHARED,
shmemq->shm_id,
@ -97,9 +81,7 @@ enum Shmemq_Error shmemq_init(
return SHMEMQ_ERROR_FAILED_MMAP;
}
shmemq->buffer->header.frames_count =
(size - sizeof(struct Shmemq_BufferHeader)) / SHMEMQ_FRAME_SIZE;
shmemq->buffer->header.frames_count = 0;
shmemq->buffer->header.read_frame_index = 0;
shmemq->buffer->header.write_frame_index = 0;