Add functions "shmemq_delete" and "shmemq_finish"

This commit is contained in:
Alex Kotov 2020-12-13 18:41:44 +05:00
parent 6ddd083230
commit 158d0dd2d3
Signed by: kotovalexarian
GPG Key ID: 553C0EBBEB5D5F08
7 changed files with 85 additions and 4 deletions

2
.gitignore vendored
View File

@ -36,5 +36,7 @@
/examples/raw_receiver
/examples/raw_sender
/tests/test_finish_consumer
/tests/test_finish_producer
/tests/test_init_consumer
/tests/test_init_producer

View File

@ -9,6 +9,8 @@ AM_CFLAGS = \
lib_LIBRARIES = libshmemq.a
TESTS = \
tests/test_finish_consumer \
tests/test_finish_producer \
tests/test_init_consumer \
tests/test_init_producer
@ -27,6 +29,14 @@ examples_raw_sender_SOURCES = \
$(libshmemq_a_SOURCES) \
examples/raw_sender.c
tests_test_finish_consumer_SOURCES = \
$(libshmemq_a_SOURCES) \
tests/test_finish_consumer.c
tests_test_finish_producer_SOURCES = \
$(libshmemq_a_SOURCES) \
tests/test_finish_producer.c
tests_test_init_consumer_SOURCES = \
$(libshmemq_a_SOURCES) \
tests/test_init_consumer.c

View File

@ -38,6 +38,8 @@ AC_CHECK_HEADERS([sys/mman.h])
AC_CHECK_HEADERS([sys/stat.h])
AC_CHECK_HEADERS([unistd.h])
AC_CHECK_FUNCS([close])
AC_CHECK_FUNCS([free])
AC_CHECK_FUNCS([ftruncate])
AC_CHECK_FUNCS([memset])
AC_CHECK_FUNCS([munmap])

View File

@ -23,10 +23,13 @@ enum Shmemq_Error {
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_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,
};
struct Shmemq_FrameHeader {
@ -68,6 +71,10 @@ enum Shmemq_Error shmemq_init(
bool is_consumer
);
enum Shmemq_Error shmemq_delete(struct Shmemq *shmemq);
enum Shmemq_Error shmemq_finish(struct Shmemq *shmemq);
#ifdef __cplusplus
}
#endif

View File

@ -9,6 +9,32 @@
#include <sys/stat.h>
#include <unistd.h>
enum Shmemq_Error shmemq_delete(struct Shmemq *shmemq)
{
const enum Shmemq_Error error = shmemq_finish(shmemq);
free(shmemq);
return error;
}
enum Shmemq_Error shmemq_finish(struct Shmemq *shmemq)
{
const size_t size =
sizeof(struct Shmemq_BufferHeader) +
SHMEMQ_FRAME_SIZE * shmemq->buffer->header.frames_count;
if (munmap(shmemq->buffer, size) != 0) return SHMEMQ_ERROR_FAILED_MUNMAP;
shmemq->buffer = NULL;
if (close(shmemq->shm_id) != 0) return SHMEMQ_ERROR_FAILED_CLOSE;
shmemq->shm_id = -1;
if (shmemq->is_consumer && shm_unlink(shmemq->name) != 0) {
return SHMEMQ_ERROR_FAILED_SHM_UNLINK;
}
return SHMEMQ_ERROR_NONE;
}
struct Shmemq *shmemq_new(
const char *const name,
const bool is_consumer,

View File

@ -0,0 +1,17 @@
#include <shmemq.h>
#include <assert.h>
int main()
{
struct Shmemq shmemq;
assert(shmemq_init(&shmemq, "/foobar", true) == SHMEMQ_ERROR_NONE);
assert(shmemq_finish(&shmemq) == SHMEMQ_ERROR_NONE);
assert(shmemq.shm_id == -1);
assert(shmemq.buffer == NULL);
return 0;
}

View File

@ -0,0 +1,17 @@
#include <shmemq.h>
#include <assert.h>
int main()
{
struct Shmemq shmemq;
assert(shmemq_init(&shmemq, "/foobar", false) == SHMEMQ_ERROR_NONE);
assert(shmemq_finish(&shmemq) == SHMEMQ_ERROR_NONE);
assert(shmemq.shm_id == -1);
assert(shmemq.buffer == NULL);
return 0;
}