On Mon, Aug 22, 2011 at 08:08:09PM -0700, Steven Dake wrote: > Rid ourselves of the mutex usage still in the code base
ACK -Angus > > 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 _______________________________________________ Openais mailing list [email protected] https://lists.linux-foundation.org/mailman/listinfo/openais
