mirror of https://github.com/tailix/libshmemq.git
Initialize with default size
This commit is contained in:
parent
52e3fa3ba0
commit
e4d35722d4
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
30
src/main.c
30
src/main.c
|
@ -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;
|
||||
|
||||
|
|
Loading…
Reference in New Issue