RB: add support for shared user data.

(I need this for flow control)

Signed-off-by: Angus Salkeld <asalkeld@redhat.com>
This commit is contained in:
Angus Salkeld 2010-10-11 13:03:25 +11:00
parent 1a13b65de1
commit 8d3ec80c19
6 changed files with 22 additions and 9 deletions

View File

@ -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.
*

View File

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

View File

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

View File

@ -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));

View File

@ -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");

View File

@ -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");