Signed-off-by: Angus Salkeld <asalkeld(a)redhat.com>
---
lib/ringbuffer.c | 52 ++++----
lib/ringbuffer.h | 35 ++++--
lib/ringbuffer_helper.c | 317 ++++++++++++++++++++++-------------------------
3 files changed, 197 insertions(+), 207 deletions(-)
diff --git a/lib/ringbuffer.c b/lib/ringbuffer.c
index 176fe59..f40e9a4 100644
--- a/lib/ringbuffer.c
+++ b/lib/ringbuffer.c
@@ -128,13 +128,13 @@ qb_ringbuffer_t *qb_rb_open(const char *name, size_t size, uint32_t
flags)
rb->shared_hdr->count = 0;
strncpy(rb->shared_hdr->hdr_path, path, PATH_MAX);
}
- if (my_lock_it_create(rb, flags) == -1) {
+ if (qb_rb_lock_create(rb, flags) == -1) {
qb_util_log(LOG_ERR, "couldn't get a shared lock %s",
strerror(errno));
goto cleanup_hdr;
}
- if (my_sem_create(rb, flags) == -1) {
+ if (qb_rb_sem_create(rb, flags) == -1) {
qb_util_log(LOG_ERR, "couldn't get a semaphore %s",
strerror(errno));
goto cleanup_hdr;
@@ -172,9 +172,9 @@ qb_ringbuffer_t *qb_rb_open(const char *name, size_t size, uint32_t
flags)
rb->shared_data[rb->shared_hdr->size] = 5;
rb->shared_hdr->ref_count = 1;
} else {
- my_lock_it(rb);
+ rb->lock_fn(rb);
rb->shared_hdr->ref_count++;
- my_unlock_it(rb);
+ rb->unlock_fn(rb);
}
return rb;
@@ -189,8 +189,8 @@ cleanup_hdr:
close(fd_hdr);
if (flags & QB_RB_FLAG_CREATE) {
unlink(rb->shared_hdr->hdr_path);
- my_lock_it_destroy(rb);
- my_sem_destroy(rb);
+ rb->lock_destroy_fn(rb);
+ rb->sem_destroy_fn(rb);
}
if (rb && (rb->shared_hdr != MAP_FAILED && rb->shared_hdr !=
NULL)) {
munmap(rb->shared_hdr, sizeof(struct qb_ringbuffer_shared_s));
@@ -203,18 +203,18 @@ void qb_rb_close(qb_ringbuffer_t * rb)
{
int32_t destroy_it = 0;
- my_lock_it(rb);
+ rb->lock_fn(rb);
rb->shared_hdr->ref_count--;
qb_util_log(LOG_INFO, "ref_count:%d", rb->shared_hdr->ref_count);
if (rb->shared_hdr->ref_count == 0) {
destroy_it = 1;
}
- my_unlock_it(rb);
+ rb->unlock_fn(rb);
if (destroy_it) {
qb_util_log(LOG_INFO, "Destroying ringbuffer");
- my_lock_it_destroy(rb);
- my_sem_destroy(rb);
+ rb->lock_destroy_fn(rb);
+ rb->sem_destroy_fn(rb);
unlink(rb->shared_hdr->data_path);
unlink(rb->shared_hdr->hdr_path);
@@ -252,11 +252,11 @@ ssize_t qb_rb_space_free(qb_ringbuffer_t * rb)
{
size_t space_free;
- if (my_lock_it(rb) == -1) {
+ if (rb->lock_fn(rb) == -1) {
return -1;
}
space_free = _qb_rb_space_free_locked_(rb);
- if (my_unlock_it(rb) == -1) {
+ if (rb->unlock_fn(rb) == -1) {
/* aarg stuck locked! */
qb_util_log(LOG_ERR, "failed to unlock ringbuffer lock %s",
strerror(errno));
@@ -296,11 +296,11 @@ ssize_t qb_rb_space_used(qb_ringbuffer_t * rb)
{
size_t used;
- if (my_lock_it(rb) == -1) {
+ if (rb->lock_fn(rb) == -1) {
return -1;
}
used = _qb_rb_space_used_locked_(rb);
- if (my_unlock_it(rb) == -1) {
+ if (rb->unlock_fn(rb) == -1) {
/* aarg stuck locked! */
qb_util_log(LOG_ERR, "failed to unlock ringbuffer lock %s",
strerror(errno));
@@ -313,7 +313,7 @@ void *qb_rb_chunk_writable_alloc(qb_ringbuffer_t * rb, size_t len)
{
uint32_t idx;
- my_lock_it(rb);
+ rb->lock_fn(rb);
/*
* Reclaim data if we are over writing and we need space
*/
@@ -325,7 +325,7 @@ void *qb_rb_chunk_writable_alloc(qb_ringbuffer_t * rb, size_t len)
} else {
if (_qb_rb_space_free_locked_(rb) <
(len + RB_CHUNK_HEADER_SIZE + 4)) {
- my_unlock_it(rb);
+ rb->unlock_fn(rb);
return NULL;
}
}
@@ -389,7 +389,7 @@ int32_t qb_rb_chunk_writable_commit(qb_ringbuffer_t * rb, size_t len)
rb->shared_hdr->read_pt, rb->shared_hdr->write_pt,
old_write_pt);
- if (my_unlock_it(rb) != 0) {
+ if (rb->unlock_fn(rb) != 0) {
qb_util_log(LOG_ERR, "failed to unlock ringbuffer lock %s",
strerror(errno));
return -1;
@@ -398,7 +398,7 @@ int32_t qb_rb_chunk_writable_commit(qb_ringbuffer_t * rb, size_t len)
/*
* post the notification to the reader
*/
- return my_sem_post(rb);
+ return rb->sem_post_fn(rb);
}
ssize_t qb_rb_chunk_write(qb_ringbuffer_t * rb, const void *data, size_t len)
@@ -446,9 +446,9 @@ static void _qb_rb_chunk_reclaim_locked_(qb_ringbuffer_t * rb)
void qb_rb_chunk_reclaim(qb_ringbuffer_t * rb)
{
- my_lock_it(rb);
+ rb->lock_fn(rb);
_qb_rb_chunk_reclaim_locked_(rb);
- my_unlock_it(rb);
+ rb->unlock_fn(rb);
}
ssize_t qb_rb_chunk_peek(qb_ringbuffer_t * rb, void **data_out)
@@ -474,13 +474,13 @@ qb_rb_chunk_read(qb_ringbuffer_t * rb, void *data_out, size_t len,
uint32_t chunk_size;
int32_t res;
- res = my_sem_timedwait(rb, timeout);
+ res = rb->sem_timedwait_fn(rb, timeout);
if (res == -1 && errno != EIDRM) {
printf("%s:%d %s\n", __func__, __LINE__, strerror(errno));
return -1;
}
- if (my_lock_it(rb) == -1) {
+ if (rb->lock_fn(rb) == -1) {
res = errno;
qb_util_log(LOG_ERR, "could not lock ringbuffer %s",
strerror(errno));
@@ -490,7 +490,7 @@ qb_rb_chunk_read(qb_ringbuffer_t * rb, void *data_out, size_t len,
if (_qb_rb_space_used_locked_(rb) == 0) {
printf("%s:%d count:%d\n", __func__, __LINE__,
rb->shared_hdr->count);
- my_unlock_it(rb);
+ rb->unlock_fn(rb);
errno = ENODATA;
return -1;
}
@@ -500,7 +500,7 @@ qb_rb_chunk_read(qb_ringbuffer_t * rb, void *data_out, size_t len,
if (len < chunk_size) {
printf("%s:%d\n", __func__, __LINE__);
- my_unlock_it(rb);
+ rb->unlock_fn(rb);
return 0;
}
@@ -509,7 +509,7 @@ qb_rb_chunk_read(qb_ringbuffer_t * rb, void *data_out, size_t len,
RB_CHUNK_HEADER_WORDS], chunk_size);
_qb_rb_chunk_reclaim_locked_(rb);
- my_unlock_it(rb);
+ rb->unlock_fn(rb);
return chunk_size;
}
@@ -539,7 +539,7 @@ static void _check_chunk_locked_(qb_ringbuffer_t * rb, uint32_t
pointer)
printf("size: %x\n", chunk_size);
printf("magic: %x\n", chunk_magic);
print_header(rb);
- my_unlock_it(rb);
+ rb->unlock_fn(rb);
assert(0);
}
}
diff --git a/lib/ringbuffer.h b/lib/ringbuffer.h
index 5885c4f..e19b7ec 100644
--- a/lib/ringbuffer.h
+++ b/lib/ringbuffer.h
@@ -40,6 +40,19 @@
#include <qb/qbutil.h>
#include <qb/qbrb.h>
+
+struct qb_ringbuffer_s;
+
+int32_t qb_rb_lock_create(struct qb_ringbuffer_s * rb, uint32_t flags);
+typedef int32_t (*qb_rb_lock_fn_t) (struct qb_ringbuffer_s * rb);
+typedef int32_t (*qb_rb_unlock_fn_t) (struct qb_ringbuffer_s * rb);
+typedef int32_t (*qb_rb_lock_destroy_fn_t) (struct qb_ringbuffer_s * rb);
+
+int32_t qb_rb_sem_create(struct qb_ringbuffer_s * rb, uint32_t flags);
+typedef int32_t (*qb_rb_sem_post_fn_t) (struct qb_ringbuffer_s * rb);
+typedef int32_t (*qb_rb_sem_timedwait_fn_t) (struct qb_ringbuffer_s * rb, int32_t
ms_timeout);
+typedef int32_t (*qb_rb_sem_destroy_fn_t) (struct qb_ringbuffer_s * rb);
+
struct qb_ringbuffer_shared_s {
volatile uint32_t write_pt;
volatile uint32_t read_pt;
@@ -48,20 +61,24 @@ struct qb_ringbuffer_shared_s {
char hdr_path[PATH_MAX];
char data_path[PATH_MAX];
int32_t ref_count;
-#if _POSIX_THREAD_PROCESS_SHARED > 0
sem_t posix_sem;
pthread_spinlock_t spinlock;
-#endif
};
struct qb_ringbuffer_s {
uint32_t flags;
-#if _POSIX_THREAD_PROCESS_SHARED < 1
int32_t lock_id;
int32_t sem_id;
-#endif
struct qb_ringbuffer_shared_s *shared_hdr;
uint32_t *shared_data;
+
+ qb_rb_lock_fn_t lock_fn;
+ qb_rb_unlock_fn_t unlock_fn;
+ qb_rb_lock_destroy_fn_t lock_destroy_fn;
+
+ qb_rb_sem_post_fn_t sem_post_fn;
+ qb_rb_sem_timedwait_fn_t sem_timedwait_fn;
+ qb_rb_sem_destroy_fn_t sem_destroy_fn;
};
#if defined(_SEM_SEMUN_UNDEFINED)
@@ -75,14 +92,6 @@ union semun {
#define RB_NS_IN_MSEC 1000000ULL
-int32_t my_lock_it_create(qb_ringbuffer_t * rb, uint32_t flags);
-int32_t my_lock_it(qb_ringbuffer_t * rb);
-int32_t my_unlock_it(qb_ringbuffer_t * rb);
-int32_t my_lock_it_destroy(qb_ringbuffer_t * rb);
-
-int32_t my_sem_create(qb_ringbuffer_t * rb, uint32_t flags);
-int32_t my_sem_post(qb_ringbuffer_t * rb);
-int32_t my_sem_timedwait(qb_ringbuffer_t * rb, int32_t ms_timeout);
-int32_t my_sem_destroy(qb_ringbuffer_t * rb);
#endif /* _RINGBUFFER_H_ */
+
diff --git a/lib/ringbuffer_helper.c b/lib/ringbuffer_helper.c
index 4ba5817..619cc16 100644
--- a/lib/ringbuffer_helper.c
+++ b/lib/ringbuffer_helper.c
@@ -22,117 +22,17 @@
#include "ringbuffer.h"
-#if _POSIX_THREAD_PROCESS_SHARED > 0
-static int32_t my_posix_sem_create(qb_ringbuffer_t * rb, uint32_t flags)
-{
- int32_t pshared = 0;
- if (flags & QB_RB_FLAG_SHARED_PROCESS) {
- if ((flags & QB_RB_FLAG_CREATE) == 0) {
- return 0;
- }
- pshared = 1;
- }
- return sem_init(&rb->shared_hdr->posix_sem, pshared, 0);
-}
-#else
-static int32_t my_sysv_sem_create(qb_ringbuffer_t * rb, uint32_t flags)
-{
- union semun options;
- int32_t res;
- key_t sem_key;
-
- sem_key = ftok(rb->shared_hdr->hdr_path, (rb->shared_hdr->size + 1));
-
- if (sem_key == -1) {
- qb_util_log(LOG_ERR, "couldn't get a sem id %s",
- strerror(errno));
- return -1;
- }
-
- if (flags & QB_RB_FLAG_CREATE) {
- rb->sem_id = semget(sem_key, 1, IPC_CREAT | IPC_EXCL | 0600);
- if (rb->sem_id == -1) {
- qb_util_log(LOG_ERR, "couldn't create a semaphore %s",
- strerror(errno));
- return -1;
- }
- options.val = 0;
- res = semctl(rb->sem_id, 0, SETVAL, options);
- } else {
- rb->sem_id = semget(sem_key, 0, 0600);
- if (rb->sem_id == -1) {
- qb_util_log(LOG_ERR, "couldn't get a sem id %s",
- strerror(errno));
- return -1;
- }
- res = 0;
- }
- qb_util_log(LOG_INFO, "sem key:%d, id:%d, value:%d",
- sem_key, rb->sem_id, semctl(rb->sem_id, 0, GETVAL, 0));
-
- return res;
-}
-#endif
-
-int32_t my_sem_create(qb_ringbuffer_t * rb, uint32_t flags)
-{
- if ((rb->flags & QB_RB_FLAG_SHARED_PROCESS) == 0) {
- return 0;
- }
-#if _POSIX_THREAD_PROCESS_SHARED > 0
- return my_posix_sem_create(rb, flags);
-#else
- return my_sysv_sem_create(rb, flags);
-#endif
-}
-
-#if _POSIX_THREAD_PROCESS_SHARED > 0
-static int32_t my_posix_sem_post(qb_ringbuffer_t * rb)
-{
- return sem_post(&rb->shared_hdr->posix_sem);
-}
-#else
-static int32_t my_sysv_sem_post(qb_ringbuffer_t * rb)
+static int32_t my_null_fn(struct qb_ringbuffer_s *rb)
{
- struct sembuf sops[1];
-
- if ((rb->flags & QB_RB_FLAG_SHARED_PROCESS) == 0) {
- return 0;
- }
-
- sops[0].sem_num = 0;
- sops[0].sem_op = 1;
- sops[0].sem_flg = 0;
-
-semop_again:
- if (semop(rb->sem_id, sops, 1) == -1) {
- if (errno == EINTR) {
- goto semop_again;
- } else {
- qb_util_log(LOG_ERR,
- "could not increment semaphore : %s",
- strerror(errno));
- }
-
- return -1;
- }
return 0;
}
-#endif
-int32_t my_sem_post(qb_ringbuffer_t * rb)
+static int32_t my_null_sem_timedwait(struct qb_ringbuffer_s *rb,
+ int32_t ms_timeout)
{
- if ((rb->flags & QB_RB_FLAG_SHARED_PROCESS) == 0) {
- return 0;
- }
-#if _POSIX_THREAD_PROCESS_SHARED > 0
- return my_posix_sem_post(rb);
-#else
- return my_sysv_sem_post(rb);
-#endif
+ return 0;
}
-#if _POSIX_THREAD_PROCESS_SHARED > 0
static int32_t my_posix_sem_timedwait(qb_ringbuffer_t * rb, int32_t ms_timeout)
{
struct timespec ts_timeout;
@@ -147,8 +47,6 @@ static int32_t my_posix_sem_timedwait(qb_ringbuffer_t * rb, int32_t
ms_timeout)
}
}
-#else
-
static int32_t my_sysv_sem_timedwait(qb_ringbuffer_t * rb, int32_t ms_timeout)
{
struct sembuf sops[1];
@@ -193,40 +91,49 @@ semop_again:
return 0;
}
-#endif
-int32_t my_sem_timedwait(qb_ringbuffer_t * rb, int32_t ms_timeout)
+static int32_t my_posix_sem_post(qb_ringbuffer_t * rb)
+{
+ return sem_post(&rb->shared_hdr->posix_sem);
+}
+
+static int32_t my_sysv_sem_post(qb_ringbuffer_t * rb)
{
+ struct sembuf sops[1];
+
if ((rb->flags & QB_RB_FLAG_SHARED_PROCESS) == 0) {
return 0;
}
-#if _POSIX_THREAD_PROCESS_SHARED > 0
- return my_posix_sem_timedwait(rb, ms_timeout);
-#else
- return my_sysv_sem_timedwait(rb, ms_timeout);
-#endif
+
+ sops[0].sem_num = 0;
+ sops[0].sem_op = 1;
+ sops[0].sem_flg = 0;
+
+semop_again:
+ if (semop(rb->sem_id, sops, 1) == -1) {
+ if (errno == EINTR) {
+ goto semop_again;
+ } else {
+ qb_util_log(LOG_ERR,
+ "could not increment semaphore : %s",
+ strerror(errno));
+ }
+
+ return -1;
+ }
+ return 0;
}
-int32_t my_sem_destroy(qb_ringbuffer_t * rb)
+static int32_t my_posix_sem_destroy(qb_ringbuffer_t * rb)
{
-#if _POSIX_THREAD_PROCESS_SHARED > 0
return sem_destroy(&rb->shared_hdr->posix_sem);
-#else
- return semctl(rb->sem_id, 0, IPC_RMID, 0);
-#endif
}
-#if _POSIX_THREAD_PROCESS_SHARED > 0
-static int32_t my_posix_lock_it_create(qb_ringbuffer_t * rb, uint32_t flags)
+static int32_t my_sysv_sem_destroy(qb_ringbuffer_t * rb)
{
- if (flags & QB_RB_FLAG_CREATE) {
- return pthread_spin_init(&rb->shared_hdr->spinlock,
- PTHREAD_PROCESS_SHARED);
- } else {
- return 0;
- }
+ return semctl(rb->sem_id, 0, IPC_RMID, 0);
}
-#else
+
static int32_t my_sysv_lock_it_create(qb_ringbuffer_t * rb, uint32_t flags)
{
union semun options;
@@ -264,26 +171,90 @@ static int32_t my_sysv_lock_it_create(qb_ringbuffer_t * rb, uint32_t
flags)
return res;
}
-#endif
-int32_t my_lock_it_create(qb_ringbuffer_t * rb, uint32_t flags)
+static int32_t my_posix_sem_create(struct qb_ringbuffer_s *rb, uint32_t flags)
{
- if ((rb->flags & QB_RB_FLAG_SHARED_PROCESS) == 0) {
- return 0;
+ int32_t pshared = 0;
+ if (flags & QB_RB_FLAG_SHARED_PROCESS) {
+ if ((flags & QB_RB_FLAG_CREATE) == 0) {
+ return 0;
+ }
+ pshared = 1;
+ }
+ return sem_init(&rb->shared_hdr->posix_sem, pshared, 0);
+}
+
+static int32_t my_sysv_sem_create(qb_ringbuffer_t * rb, uint32_t flags)
+{
+ union semun options;
+ int32_t res;
+ key_t sem_key;
+
+ sem_key = ftok(rb->shared_hdr->hdr_path, (rb->shared_hdr->size + 1));
+
+ if (sem_key == -1) {
+ qb_util_log(LOG_ERR, "couldn't get a sem id %s",
+ strerror(errno));
+ return -1;
+ }
+
+ if (flags & QB_RB_FLAG_CREATE) {
+ rb->sem_id = semget(sem_key, 1, IPC_CREAT | IPC_EXCL | 0600);
+ if (rb->sem_id == -1) {
+ qb_util_log(LOG_ERR, "couldn't create a semaphore %s",
+ strerror(errno));
+ return -1;
+ }
+ options.val = 0;
+ res = semctl(rb->sem_id, 0, SETVAL, options);
+ } else {
+ rb->sem_id = semget(sem_key, 0, 0600);
+ if (rb->sem_id == -1) {
+ qb_util_log(LOG_ERR, "couldn't get a sem id %s",
+ strerror(errno));
+ return -1;
+ }
+ res = 0;
}
+ qb_util_log(LOG_INFO, "sem key:%d, id:%d, value:%d",
+ sem_key, rb->sem_id, semctl(rb->sem_id, 0, GETVAL, 0));
+
+ return res;
+}
+
+int32_t qb_rb_sem_create(struct qb_ringbuffer_s * rb, uint32_t flags)
+{
+ int32_t can_use_shared_posix = 0;
#if _POSIX_THREAD_PROCESS_SHARED > 0
- return my_posix_lock_it_create(rb, flags);
-#else
- return my_sysv_lock_it_create(rb, flags);
+ can_use_shared_posix = 1;
#endif
+
+ if (((rb->flags & QB_RB_FLAG_SHARED_PROCESS) == 0) &&
+ (rb->flags & QB_RB_FLAG_SHARED_THREAD) == 0) {
+ rb->sem_timedwait_fn = my_null_sem_timedwait;
+ rb->sem_post_fn = my_null_fn;
+ rb->sem_destroy_fn = my_null_fn;
+ return 0;
+ } else if ((can_use_shared_posix &&
+ (rb->flags & QB_RB_FLAG_SHARED_PROCESS)) ||
+ rb->flags & QB_RB_FLAG_SHARED_THREAD) {
+ rb->sem_timedwait_fn = my_posix_sem_timedwait;
+ rb->sem_post_fn = my_posix_sem_post;
+ rb->sem_destroy_fn = my_posix_sem_destroy;
+ return my_posix_sem_create(rb, flags);
+ } else {
+ rb->sem_timedwait_fn = my_sysv_sem_timedwait;
+ rb->sem_post_fn = my_sysv_sem_post;
+ rb->sem_destroy_fn = my_sysv_sem_destroy;
+ return my_sysv_sem_create(rb, flags);
+ }
}
-#if _POSIX_THREAD_PROCESS_SHARED > 0
static int32_t my_posix_lock_it(qb_ringbuffer_t * rb)
{
return pthread_spin_lock(&rb->shared_hdr->spinlock);
}
-#else
+
static int32_t my_sysv_lock_it(qb_ringbuffer_t * rb)
{
struct sembuf sops[2];
@@ -311,26 +282,12 @@ semop_again:
}
return 0;
}
-#endif
-
-int32_t my_lock_it(qb_ringbuffer_t * rb)
-{
- if ((rb->flags & QB_RB_FLAG_SHARED_PROCESS) == 0) {
- return 0;
- }
-#if _POSIX_THREAD_PROCESS_SHARED > 0
- return my_posix_lock_it(rb);
-#else
- return my_sysv_lock_it(rb);
-#endif
-}
-#if _POSIX_THREAD_PROCESS_SHARED > 0
static int32_t my_posix_unlock_it(qb_ringbuffer_t * rb)
{
return pthread_spin_unlock(&rb->shared_hdr->spinlock);
}
-#else
+
static int32_t my_sysv_unlock_it(qb_ringbuffer_t * rb)
{
struct sembuf lock_it;
@@ -351,28 +308,52 @@ semop_again:
}
return 0;
}
-#endif
-int32_t my_unlock_it(qb_ringbuffer_t * rb)
+static int32_t my_posix_lock_it_destroy(qb_ringbuffer_t * rb)
{
- if ((rb->flags & QB_RB_FLAG_SHARED_PROCESS) == 0) {
- return 0;
- }
-#if _POSIX_THREAD_PROCESS_SHARED > 0
- return my_posix_unlock_it(rb);
-#else
- return my_sysv_unlock_it(rb);
-#endif
+ return pthread_spin_destroy(&rb->shared_hdr->spinlock);
}
-int32_t my_lock_it_destroy(qb_ringbuffer_t * rb)
+static int32_t my_sysv_lock_it_destroy(qb_ringbuffer_t * rb)
{
- if ((rb->flags & QB_RB_FLAG_SHARED_PROCESS) == 0) {
- return 0;
- }
-#if _POSIX_THREAD_PROCESS_SHARED > 0
- return pthread_spin_destroy(&rb->shared_hdr->spinlock);
-#else
return semctl(rb->lock_id, 0, IPC_RMID, 0);
+}
+
+int32_t qb_rb_lock_create(struct qb_ringbuffer_s * rb, uint32_t flags)
+{
+ int32_t pshared = 0;
+ int32_t can_use_shared_posix = 0;
+#if _POSIX_THREAD_PROCESS_SHARED > 0
+ can_use_shared_posix = 1;
#endif
+
+ if (((rb->flags & QB_RB_FLAG_SHARED_PROCESS) == 0) &&
+ (rb->flags & QB_RB_FLAG_SHARED_THREAD) == 0) {
+ rb->lock_fn = my_null_fn;
+ rb->unlock_fn = my_null_fn;
+ rb->lock_destroy_fn = my_null_fn;
+ return 0;
+ } else if ((can_use_shared_posix &&
+ (rb->flags & QB_RB_FLAG_SHARED_PROCESS)) ||
+ rb->flags & QB_RB_FLAG_SHARED_THREAD) {
+ rb->lock_fn = my_posix_lock_it;
+ rb->unlock_fn = my_posix_unlock_it;
+ rb->lock_destroy_fn = my_posix_lock_it_destroy;
+
+ if (rb->flags & QB_RB_FLAG_SHARED_PROCESS) {
+ pshared = PTHREAD_PROCESS_SHARED;
+ }
+
+ if (flags & QB_RB_FLAG_CREATE) {
+ return pthread_spin_init(&rb->shared_hdr->spinlock,
+ pshared);
+ } else {
+ return 0;
+ }
+ } else {
+ rb->lock_fn = my_sysv_lock_it;
+ rb->unlock_fn = my_sysv_unlock_it;
+ rb->lock_destroy_fn = my_sysv_lock_it_destroy;
+ return my_sysv_lock_it_create(rb, flags);
+ }
}
--
1.6.6.1