diff --git a/include/qb/qbrb.h b/include/qb/qbrb.h index 88dc8c6..7bb57c1 100644 --- a/include/qb/qbrb.h +++ b/include/qb/qbrb.h @@ -114,7 +114,8 @@ typedef struct qb_ringbuffer_s qb_ringbuffer_t; * @return a new ring buffer or NULL if there was a problem. * @see QB_RB_FLAG_CREATE, QB_RB_FLAG_OVERWRITE, QB_RB_FLAG_SHARED_THREAD, QB_RB_FLAG_SHARED_PROCESS */ -qb_ringbuffer_t *qb_rb_open(const char *name, size_t size, uint32_t flags); +qb_ringbuffer_t *qb_rb_open(const char *name, size_t size, uint32_t flags, + size_t shared_user_data_size); /** * Dereference the ringbuffer and if we are the last user destroy it. @@ -133,6 +134,9 @@ void qb_rb_close(qb_ringbuffer_t * rb, int32_t force_it); */ char *qb_rb_name_get(qb_ringbuffer_t * rb); + +void *qb_rb_shared_user_data_get(qb_ringbuffer_t * rb); + /** * Write a chunk to the ring buffer. * diff --git a/lib/ringbuffer.c b/lib/ringbuffer.c index 319d6df..65e8c57 100644 --- a/lib/ringbuffer.c +++ b/lib/ringbuffer.c @@ -82,7 +82,8 @@ static size_t _qb_rb_space_used_locked_(qb_ringbuffer_t * rb); static void _qb_rb_chunk_check_locked_(qb_ringbuffer_t * rb, uint32_t pointer); static void _qb_rb_chunk_reclaim_locked_(qb_ringbuffer_t * rb); -qb_ringbuffer_t *qb_rb_open(const char *name, size_t size, uint32_t flags) +qb_ringbuffer_t *qb_rb_open(const char *name, size_t size, uint32_t flags, + size_t shared_user_data_size) { struct qb_ringbuffer_s *rb = malloc(sizeof(struct qb_ringbuffer_s)); size_t real_size = QB_ROUNDUP(size, sysconf(_SC_PAGESIZE)); @@ -90,6 +91,8 @@ qb_ringbuffer_t *qb_rb_open(const char *name, size_t size, uint32_t flags) int32_t fd_hdr; int32_t fd_data; uint32_t file_flags = O_RDWR; + size_t shared_size = sizeof(struct qb_ringbuffer_shared_s); + shared_size += shared_user_data_size; if (flags & QB_RB_FLAG_CREATE) { file_flags |= O_CREAT | O_TRUNC; @@ -98,7 +101,7 @@ qb_ringbuffer_t *qb_rb_open(const char *name, size_t size, uint32_t flags) * Create a shared_hdr memory segment for the header. */ fd_hdr = qb_util_mmap_file_open(path, name, - sizeof(struct qb_ringbuffer_shared_s), + shared_size, file_flags); if (fd_hdr < 0) { qb_util_log(LOG_ERR, "couldn't create file for mmap"); @@ -230,6 +233,11 @@ char *qb_rb_name_get(qb_ringbuffer_t * rb) return rb->shared_hdr->hdr_path; } +void *qb_rb_shared_user_data_get(qb_ringbuffer_t * rb) +{ + return rb->shared_hdr->user_data; +} + static size_t _qb_rb_space_free_locked_(qb_ringbuffer_t * rb) { uint32_t write_size; diff --git a/lib/ringbuffer_int.h b/lib/ringbuffer_int.h index 917d41c..af94f8c 100644 --- a/lib/ringbuffer_int.h +++ b/lib/ringbuffer_int.h @@ -56,6 +56,7 @@ struct qb_ringbuffer_shared_s { int32_t ref_count; sem_t posix_sem; pthread_spinlock_t spinlock; + char user_data[1]; }; struct qb_ringbuffer_s { diff --git a/tests/check_rb.c b/tests/check_rb.c index 11c2097..39d70ab 100644 --- a/tests/check_rb.c +++ b/tests/check_rb.c @@ -43,7 +43,7 @@ START_TEST(test_ring_buffer1) ssize_t actual; ssize_t avail; - rb = qb_rb_open("test1", 200, QB_RB_FLAG_CREATE); + rb = qb_rb_open("test1", 200, QB_RB_FLAG_CREATE, 0); fail_if(rb == NULL); for (b = 0; b < 3; b++) { @@ -97,7 +97,7 @@ START_TEST(test_ring_buffer2) int64_t *new_data; ssize_t l; - t = qb_rb_open("test2", 200 * sizeof(int64_t), QB_RB_FLAG_CREATE); + t = qb_rb_open("test2", 200 * sizeof(int64_t), QB_RB_FLAG_CREATE, 0); fail_if(t == NULL); for (i = 0; i < 200; i++) { l = qb_rb_chunk_write(t, &v, sizeof(v)); @@ -143,7 +143,7 @@ START_TEST(test_ring_buffer3) ssize_t l; size_t len = strlen(v) + 1; - t = qb_rb_open("test3", 10, QB_RB_FLAG_CREATE | QB_RB_FLAG_OVERWRITE); + t = qb_rb_open("test3", 10, QB_RB_FLAG_CREATE | QB_RB_FLAG_OVERWRITE, 0); fail_if(t == NULL); for (i = 0; i < 9000; i++) { l = qb_rb_chunk_write(t, v, len); @@ -170,7 +170,7 @@ START_TEST(test_ring_buffer4) char *new_data; ssize_t l; - t = qb_rb_open("test4", 10, QB_RB_FLAG_CREATE | QB_RB_FLAG_OVERWRITE); + t = qb_rb_open("test4", 10, QB_RB_FLAG_CREATE | QB_RB_FLAG_OVERWRITE, 0); fail_if(t == NULL); for (i = 0; i < 2000; i++) { l = qb_rb_chunk_write(t, data, strlen(data)); diff --git a/tests/rbreader.c b/tests/rbreader.c index a9a5696..816cc3c 100644 --- a/tests/rbreader.c +++ b/tests/rbreader.c @@ -37,7 +37,7 @@ int32_t main(int32_t argc, char *argv[]) qb_util_set_log_function(libqb_log_writer); rb = qb_rb_open("tester", BUFFER_CHUNK_SIZE * 3, - QB_RB_FLAG_SHARED_PROCESS | QB_RB_FLAG_CREATE); + QB_RB_FLAG_SHARED_PROCESS | QB_RB_FLAG_CREATE, 0); if (rb == NULL) { printf("reader: failed to create ringbuffer\n"); diff --git a/tests/rbwriter.c b/tests/rbwriter.c index 6b69031..56eab1c 100644 --- a/tests/rbwriter.c +++ b/tests/rbwriter.c @@ -92,7 +92,7 @@ static void bm_finish(const char *operation, int32_t size) static void bmc_connect(void) { rb = qb_rb_open("tester", BUFFER_CHUNK_SIZE * 3, - QB_RB_FLAG_SHARED_PROCESS); + QB_RB_FLAG_SHARED_PROCESS, 0); if (rb == NULL) { printf("writer: failed to create ringbuffer\n");