mirror of
https://salsa.debian.org/ha-team/libqb
synced 2026-01-01 20:27:41 +00:00
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:
parent
1a13b65de1
commit
8d3ec80c19
@ -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.
|
||||
*
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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 {
|
||||
|
||||
@ -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));
|
||||
|
||||
@ -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");
|
||||
|
||||
@ -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");
|
||||
|
||||
Loading…
Reference in New Issue
Block a user