Rid ourselves of the mutex usage still in the code base
Signed-off-by: Steven Dake <[email protected]>
---
include/corosync/hdb.h | 307 +++---------------------------------------------
lcr/Makefile.am | 3 +-
2 files changed, 21 insertions(+), 289 deletions(-)
diff --git a/include/corosync/hdb.h b/include/corosync/hdb.h
index 88742f9..00fa459 100644
--- a/include/corosync/hdb.h
+++ b/include/corosync/hdb.h
@@ -47,36 +47,17 @@
#include <pthread.h>
#include <stdint.h>
#include <inttypes.h>
+#include <qb/qbhdb.h>
-typedef uint64_t hdb_handle_t;
+typedef qb_handle_t hdb_handle_t;
/*
* Formatting for string printing on 32/64 bit systems
*/
-#define HDB_D_FORMAT "%"PRIu64
-#define HDB_X_FORMAT "%"PRIx64
+#define HDB_D_FORMAT QB_HDB_D_FORMAT
+#define HDB_X_FORMAT QB_HDB_X_FORMAT
-enum HDB_HANDLE_STATE {
- HDB_HANDLE_STATE_EMPTY,
- HDB_HANDLE_STATE_PENDINGREMOVAL,
- HDB_HANDLE_STATE_ACTIVE
-};
-
-struct hdb_handle {
- int state;
- void *instance;
- int check;
- int ref_count;
-};
-
-struct hdb_handle_database {
- unsigned int handle_count;
- struct hdb_handle *handles;
- unsigned int iterator;
- void (*destructor) (void *);
- pthread_mutex_t lock;
- unsigned int first_run;
-};
+#define hdb_handle_database qb_hdb
static inline void hdb_database_lock (pthread_mutex_t *mutex)
{
@@ -97,28 +78,18 @@ static inline void hdb_database_lock_destroy
(pthread_mutex_t *mutex)
pthread_mutex_destroy (mutex);
}
-#define DECLARE_HDB_DATABASE(database_name,destructor_function)
\
-static struct hdb_handle_database (database_name) = { \
- .handle_count = 0, \
- .handles = NULL, \
- .iterator = 0, \
- .destructor = destructor_function, \
- .first_run = 1 \
-}; \
+#define DECLARE_HDB_DATABASE QB_HDB_DECLARE
static inline void hdb_create (
struct hdb_handle_database *handle_database)
{
- memset (handle_database, 0, sizeof (struct hdb_handle_database));
- hdb_database_lock_init (&handle_database->lock);
+ qb_hdb_create (handle_database);
}
static inline void hdb_destroy (
struct hdb_handle_database *handle_database)
{
- free (handle_database->handles);
- hdb_database_lock_destroy (&handle_database->lock);
- memset (handle_database, 0, sizeof (struct hdb_handle_database));
+ qb_hdb_destroy (handle_database);
}
@@ -127,72 +98,8 @@ static inline int hdb_handle_create (
int instance_size,
hdb_handle_t *handle_id_out)
{
- int handle;
- unsigned int check;
- void *new_handles;
- int found = 0;
- void *instance;
- int i;
-
- if (handle_database->first_run == 1) {
- handle_database->first_run = 0;
- hdb_database_lock_init (&handle_database->lock);
- }
- hdb_database_lock (&handle_database->lock);
-
- for (handle = 0; handle < handle_database->handle_count; handle++) {
- if (handle_database->handles[handle].state ==
HDB_HANDLE_STATE_EMPTY) {
- found = 1;
- break;
- }
- }
-
- if (found == 0) {
- handle_database->handle_count += 1;
- new_handles = (struct hdb_handle *)realloc
(handle_database->handles,
- sizeof (struct hdb_handle) *
handle_database->handle_count);
- if (new_handles == NULL) {
- hdb_database_unlock (&handle_database->lock);
- errno = ENOMEM;
- return (-1);
- }
- handle_database->handles = new_handles;
- }
-
- instance = (void *)malloc (instance_size);
- if (instance == 0) {
- errno = ENOMEM;
- return (-1);
- }
-
- /*
- * This code makes sure the random number isn't zero
- * We use 0 to specify an invalid handle out of the 1^64 address space
- * If we get 0 200 times in a row, the RNG may be broken
- */
- for (i = 0; i < 200; i++) {
- check = random();
-
- if (check != 0 && check != 0xffffffff) {
- break;
- }
- }
-
- memset (instance, 0, instance_size);
-
- handle_database->handles[handle].state = HDB_HANDLE_STATE_ACTIVE;
-
- handle_database->handles[handle].instance = instance;
-
- handle_database->handles[handle].ref_count = 1;
-
- handle_database->handles[handle].check = check;
-
- *handle_id_out = (((unsigned long long)(check)) << 32) | handle;
-
- hdb_database_unlock (&handle_database->lock);
-
- return (0);
+ return (qb_hdb_handle_create (handle_database, instance_size,
+ handle_id_out));
}
static inline int hdb_handle_get (
@@ -200,42 +107,7 @@ static inline int hdb_handle_get (
hdb_handle_t handle_in,
void **instance)
{
- unsigned int check = ((unsigned int)(((unsigned long long)handle_in) >>
32));
- unsigned int handle = handle_in & 0xffffffff;
-
- if (handle_database->first_run == 1) {
- handle_database->first_run = 0;
- hdb_database_lock_init (&handle_database->lock);
- }
- hdb_database_lock (&handle_database->lock);
-
- *instance = NULL;
- if (handle >= handle_database->handle_count) {
- hdb_database_unlock (&handle_database->lock);
- errno = EBADF;
- return (-1);
- }
-
- if (handle_database->handles[handle].state != HDB_HANDLE_STATE_ACTIVE) {
- hdb_database_unlock (&handle_database->lock);
- errno = EBADF;
- return (-1);
- }
-
- if (check != 0xffffffff &&
- check != handle_database->handles[handle].check) {
-
- hdb_database_unlock (&handle_database->lock);
- errno = EBADF;
- return (-1);
- }
-
- *instance = handle_database->handles[handle].instance;
-
- handle_database->handles[handle].ref_count += 1;
-
- hdb_database_unlock (&handle_database->lock);
- return (0);
+ return (qb_hdb_handle_get (handle_database, handle_in, instance));
}
static inline int hdb_handle_get_always (
@@ -243,159 +115,34 @@ static inline int hdb_handle_get_always (
hdb_handle_t handle_in,
void **instance)
{
- unsigned int check = ((unsigned int)(((unsigned long long)handle_in) >>
32));
- unsigned int handle = handle_in & 0xffffffff;
-
- if (handle_database->first_run == 1) {
- handle_database->first_run = 0;
- hdb_database_lock_init (&handle_database->lock);
- }
- hdb_database_lock (&handle_database->lock);
-
- *instance = NULL;
- if (handle >= handle_database->handle_count) {
- hdb_database_unlock (&handle_database->lock);
- errno = EBADF;
- return (-1);
- }
-
- if (handle_database->handles[handle].state == HDB_HANDLE_STATE_EMPTY) {
- hdb_database_unlock (&handle_database->lock);
- errno = EBADF;
- return (-1);
- }
-
- if (check != 0xffffffff &&
- check != handle_database->handles[handle].check) {
-
- hdb_database_unlock (&handle_database->lock);
- errno = EBADF;
- return (-1);
- }
-
- *instance = handle_database->handles[handle].instance;
-
- handle_database->handles[handle].ref_count += 1;
-
- hdb_database_unlock (&handle_database->lock);
- return (0);
+ return (qb_hdb_handle_get_always (handle_database, handle_in,
instance));
}
static inline int hdb_handle_put (
struct hdb_handle_database *handle_database,
hdb_handle_t handle_in)
{
- unsigned int check = ((unsigned int)(((unsigned long long)handle_in) >>
32));
- unsigned int handle = handle_in & 0xffffffff;
-
- if (handle_database->first_run == 1) {
- handle_database->first_run = 0;
- hdb_database_lock_init (&handle_database->lock);
- }
- hdb_database_lock (&handle_database->lock);
-
- if (handle >= handle_database->handle_count) {
- hdb_database_unlock (&handle_database->lock);
-
- errno = EBADF;
- return (-1);
- }
-
- if (check != 0xffffffff &&
- check != handle_database->handles[handle].check) {
-
- hdb_database_unlock (&handle_database->lock);
- errno = EBADF;
- return (-1);
- }
-
- handle_database->handles[handle].ref_count -= 1;
- assert (handle_database->handles[handle].ref_count >= 0);
-
- if (handle_database->handles[handle].ref_count == 0) {
- if (handle_database->destructor) {
- handle_database->destructor
(handle_database->handles[handle].instance);
- }
- free (handle_database->handles[handle].instance);
- memset (&handle_database->handles[handle], 0, sizeof (struct
hdb_handle));
- }
- hdb_database_unlock (&handle_database->lock);
- return (0);
+ return (qb_hdb_handle_put (handle_database, handle_in));
}
static inline int hdb_handle_destroy (
struct hdb_handle_database *handle_database,
hdb_handle_t handle_in)
{
- unsigned int check = ((unsigned int)(((unsigned long long)handle_in) >>
32));
- unsigned int handle = handle_in & 0xffffffff;
- int res;
-
- if (handle_database->first_run == 1) {
- handle_database->first_run = 0;
- hdb_database_lock_init (&handle_database->lock);
- }
- hdb_database_lock (&handle_database->lock);
-
- if (handle >= handle_database->handle_count) {
- hdb_database_unlock (&handle_database->lock);
-
- errno = EBADF;
- return (-1);
- }
-
- if (check != 0xffffffff &&
- check != handle_database->handles[handle].check) {
- hdb_database_unlock (&handle_database->lock);
- errno = EBADF;
- return (-1);
- }
-
- handle_database->handles[handle].state =
HDB_HANDLE_STATE_PENDINGREMOVAL;
- hdb_database_unlock (&handle_database->lock);
- res = hdb_handle_put (handle_database, handle_in);
- return (res);
+ return (qb_hdb_handle_destroy (handle_database, handle_in));
}
static inline int hdb_handle_refcount_get (
struct hdb_handle_database *handle_database,
hdb_handle_t handle_in)
{
- unsigned int check = ((unsigned int)(((unsigned long long)handle_in) >>
32));
- unsigned int handle = handle_in & 0xffffffff;
-
- int refcount = 0;
-
- if (handle_database->first_run == 1) {
- handle_database->first_run = 0;
- hdb_database_lock_init (&handle_database->lock);
- }
- hdb_database_lock (&handle_database->lock);
-
- if (handle >= handle_database->handle_count) {
- hdb_database_unlock (&handle_database->lock);
- errno = EBADF;
- return (-1);
- }
-
- if (check != 0xffffffff &&
- check != handle_database->handles[handle].check) {
- hdb_database_unlock (&handle_database->lock);
- errno = EBADF;
- return (-1);
- }
-
- refcount = handle_database->handles[handle].ref_count;
-
- hdb_database_unlock (&handle_database->lock);
-
- return (refcount);
+ return (qb_hdb_handle_refcount_get (handle_database, handle_in));
}
static inline void hdb_iterator_reset (
struct hdb_handle_database *handle_database)
{
- handle_database->iterator = 0;
+ qb_hdb_iterator_reset (handle_database);
}
static inline int hdb_iterator_next (
@@ -403,33 +150,17 @@ static inline int hdb_iterator_next (
void **instance,
hdb_handle_t *handle)
{
- int res = -1;
-
- while (handle_database->iterator < handle_database->handle_count) {
- *handle = ((unsigned long
long)(handle_database->handles[handle_database->iterator].check) << 32) |
handle_database->iterator;
- res = hdb_handle_get (
- handle_database,
- *handle,
- instance);
-
- handle_database->iterator += 1;
- if (res == 0) {
- break;
- }
- }
- return (res);
+ return (qb_hdb_iterator_next (handle_database, instance, handle));
}
static inline unsigned int hdb_base_convert (hdb_handle_t handle)
{
- return (handle & 0xffffffff);
+ return (qb_hdb_base_convert (handle));
}
static inline unsigned long long hdb_nocheck_convert (unsigned int handle)
{
- unsigned long long retvalue = 0xffffffffULL << 32 | handle;
-
- return (retvalue);
+ return (qb_hdb_nocheck_convert (handle));
}
#endif /* HDB_H_DEFINED */
diff --git a/lcr/Makefile.am b/lcr/Makefile.am
index 94e602d..9c2434e 100644
--- a/lcr/Makefile.am
+++ b/lcr/Makefile.am
@@ -45,9 +45,10 @@ uic_SOURCES = uic.c
liblcr_a_SOURCES = lcr_ifact.c
test_SOURCES = test.c uis.c
-test_LDADD = liblcr.a
+test_LDADD = liblcr.a $(LIBQB_LIBS)
test_static_SOURCES = test.c libtest_a.c libtest_b.c uis.c lcr_ifact.c
+test_static_LDADD = $(LIBQB_LIBS)
if BUILD_DARWIN
--
1.7.6
_______________________________________________
Openais mailing list
[email protected]
https://lists.linux-foundation.org/mailman/listinfo/openais