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

Reply via email to