diff --git a/exec/coropoll.c b/exec/coropoll.c index c791f8fa..a0aa8c3a 100644 --- a/exec/coropoll.c +++ b/exec/coropoll.c @@ -63,14 +63,7 @@ struct poll_instance { int stop_requested; }; -/* - * All instances in one database - */ -static struct hdb_handle_database poll_instance_database = { - .handle_count = 0, - .handles = 0, - .iterator = 0 -}; +DECLARE_HDB_DATABASE (poll_instance_database); hdb_handle_t poll_create (void) { diff --git a/exec/objdb.c b/exec/objdb.c index d04f9595..1f34f7db 100644 --- a/exec/objdb.c +++ b/exec/objdb.c @@ -98,20 +98,9 @@ static pthread_rwlock_t reload_lock; static pthread_t lock_thread; static pthread_mutex_t meta_lock; -static struct hdb_handle_database object_instance_database = { - .handle_count = 0, - .handles = 0, - .iterator = 0, - .mutex = PTHREAD_MUTEX_INITIALIZER -}; - -static struct hdb_handle_database object_find_instance_database = { - .handle_count = 0, - .handles = 0, - .iterator = 0, - .mutex = PTHREAD_MUTEX_INITIALIZER -}; +DECLARE_HDB_DATABASE (object_instance_database); +DECLARE_HDB_DATABASE (object_find_instance_database); static void objdb_wrlock(void) { diff --git a/exec/totemnet.c b/exec/totemnet.c index b50752ad..01338ed7 100644 --- a/exec/totemnet.c +++ b/exec/totemnet.c @@ -206,15 +206,7 @@ static int totemnet_build_sockets ( static struct totem_ip_address localhost; -/* - * All instances in one database - */ -static struct hdb_handle_database totemnet_instance_database = { - .handle_count = 0, - .handles = 0, - .iterator = 0, - .mutex = PTHREAD_MUTEX_INITIALIZER -}; +DECLARE_HDB_DATABASE (totemnet_instance_database); static void totemnet_instance_initialize (struct totemnet_instance *instance) { diff --git a/exec/totempg.c b/exec/totempg.c index f723decf..8ba64cef 100644 --- a/exec/totempg.c +++ b/exec/totempg.c @@ -227,12 +227,7 @@ struct totempg_group_instance { int groups_cnt; }; -static struct hdb_handle_database totempg_groups_instance_database = { - .handle_count = 0, - .handles = 0, - .iterator = 0, - .mutex = PTHREAD_MUTEX_INITIALIZER -}; +DECLARE_HDB_DATABASE (totempg_groups_instance_database); static unsigned char next_fragment = 1; diff --git a/exec/totemrrp.c b/exec/totemrrp.c index d6354df3..ef56df01 100644 --- a/exec/totemrrp.c +++ b/exec/totemrrp.c @@ -467,13 +467,7 @@ struct rrp_algo *rrp_algos[] = { /* * All instances in one database */ -static struct hdb_handle_database totemrrp_instance_database = { - .handle_count = 0, - .handles = 0, - .iterator = 0, - .mutex = PTHREAD_MUTEX_INITIALIZER -}; - +DECLARE_HDB_DATABASE (totemrrp_instance_database); #define log_printf(level, format, args...) \ do { \ diff --git a/exec/totemsrp.c b/exec/totemsrp.c index db08edba..d10dec0b 100644 --- a/exec/totemsrp.c +++ b/exec/totemsrp.c @@ -612,12 +612,8 @@ void main_iface_change_fn ( /* * All instances in one database */ -static struct hdb_handle_database totemsrp_instance_database = { - .handle_count = 0, - .handles = 0, - .iterator = 0, - .mutex = PTHREAD_MUTEX_INITIALIZER -}; +DECLARE_HDB_DATABASE (totemsrp_instance_database); + struct message_handlers totemsrp_message_handlers = { 6, { diff --git a/include/corosync/hdb.h b/include/corosync/hdb.h index c61490fe..acca50c7 100644 --- a/include/corosync/hdb.h +++ b/include/corosync/hdb.h @@ -60,14 +60,80 @@ struct hdb_handle_database { unsigned int handle_count; struct hdb_handle *handles; unsigned int iterator; - pthread_mutex_t mutex; +#if defined(HAVE_PTHREAD_SPIN_LOCK) + pthread_spinlock_t lock; +#else + pthread_mutex_t lock; +#endif + unsigned int first_run; }; +#if defined(HAVE_PTHREAD_SPIN_LOCK) +static inline void hdb_database_lock (pthread_spinlock_t *spinlock) +{ + pthread_spin_lock (spinlock); +} + +static inline void hdb_database_unlock (pthread_spinlock_t *spinlock) +{ + pthread_spin_unlock (spinlock); +} +static inline void hdb_database_lock_init (pthread_spinlock_t *spinlock) +{ + pthread_spin_init (spinlock, 0); +} + +static inline void hdb_database_lock_destroy (pthread_spinlock_t *spinlock) +{ + pthread_spin_destroy (spinlock); +} + +#else +static inline void hdb_database_lock (pthread_mutex_t *mutex) +{ + pthread_mutex_lock (mutex); +} + +static inline void hdb_database_unlock (pthread_mutex_t *mutex) +{ + pthread_mutex_unlock (mutex); +} +static inline void hdb_database_lock_init (pthread_mutex_t *mutex) +{ + pthread_mutex_init (mutex, NULL); +} + +static inline void hdb_database_lock_destroy (pthread_mutex_t *mutex) +{ + pthread_mutex_destroy (mutex); +} +#endif + +#define DECLARE_HDB_DATABASE(database_name) \ +static struct hdb_handle_database (database_name); \ +static void database_name##_init(void)__attribute__((constructor)); \ +static void database_name##_init(void) \ +{ \ + memset (&(database_name), 0, sizeof (struct hdb_handle_database));\ + hdb_database_lock_init (&(database_name).lock); \ +} + +#define DECLARE_HDB_DATABASE_FIRSTRUN(database_name) \ +static struct hdb_handle_database (database_name) = { \ + .first_run = 1, \ +}; \ +static void database_name##_init(void)__attribute__((constructor)); \ +static void database_name##_init(void) \ +{ \ + memset (&(database_name), 0, sizeof (struct hdb_handle_database));\ + hdb_database_lock_init (&(database_name).lock); \ +} + static inline void hdb_create ( struct hdb_handle_database *handle_database) { memset (handle_database, 0, sizeof (struct hdb_handle_database)); - pthread_mutex_init (&handle_database->mutex, NULL); + hdb_database_lock_init (&handle_database->lock); } static inline void hdb_destroy ( @@ -76,7 +142,7 @@ static inline void hdb_destroy ( if (handle_database->handles) { free (handle_database->handles); } - pthread_mutex_destroy (&handle_database->mutex); + hdb_database_lock_destroy (&handle_database->lock); memset (handle_database, 0, sizeof (struct hdb_handle_database)); } @@ -93,7 +159,11 @@ static inline int hdb_handle_create ( void *instance; int i; - pthread_mutex_lock (&handle_database->mutex); + if (handle_database->first_run == 1) { + memset (handle_database, 0, sizeof (struct hdb_handle_database)); + 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) { @@ -107,7 +177,7 @@ static inline int hdb_handle_create ( new_handles = (struct hdb_handle *)realloc (handle_database->handles, sizeof (struct hdb_handle) * handle_database->handle_count); if (new_handles == NULL) { - pthread_mutex_unlock (&handle_database->mutex); + hdb_database_unlock (&handle_database->lock); return (-1); } handle_database->handles = new_handles; @@ -143,7 +213,7 @@ static inline int hdb_handle_create ( *handle_id_out = (((unsigned long long)(check)) << 32) | handle; - pthread_mutex_unlock (&handle_database->mutex); + hdb_database_unlock (&handle_database->lock); return (0); } @@ -156,23 +226,23 @@ static inline int hdb_handle_get ( unsigned int check = ((unsigned int)(((unsigned long long)handle_in) >> 32)); unsigned int handle = handle_in & 0xffffffff; - pthread_mutex_lock (&handle_database->mutex); + hdb_database_lock (&handle_database->lock); if (check != 0xffffffff && check != handle_database->handles[handle].check) { - pthread_mutex_unlock (&handle_database->mutex); + hdb_database_unlock (&handle_database->lock); return (-1); } *instance = NULL; if (handle >= handle_database->handle_count) { - pthread_mutex_unlock (&handle_database->mutex); + hdb_database_unlock (&handle_database->lock); return (-1); } if (handle_database->handles[handle].state != HDB_HANDLE_STATE_ACTIVE) { - pthread_mutex_unlock (&handle_database->mutex); + hdb_database_unlock (&handle_database->lock); return (-1); } @@ -180,7 +250,7 @@ static inline int hdb_handle_get ( handle_database->handles[handle].ref_count += 1; - pthread_mutex_unlock (&handle_database->mutex); + hdb_database_unlock (&handle_database->lock); return (0); } @@ -191,12 +261,12 @@ static inline int hdb_handle_put ( unsigned int check = ((unsigned int)(((unsigned long long)handle_in) >> 32)); unsigned int handle = handle_in & 0xffffffff; - pthread_mutex_lock (&handle_database->mutex); + hdb_database_lock (&handle_database->lock); if (check != 0xffffffff && check != handle_database->handles[handle].check) { - pthread_mutex_unlock (&handle_database->mutex); + hdb_database_unlock (&handle_database->lock); return (-1); } @@ -207,7 +277,7 @@ static inline int hdb_handle_put ( free (handle_database->handles[handle].instance); memset (&handle_database->handles[handle], 0, sizeof (struct hdb_handle)); } - pthread_mutex_unlock (&handle_database->mutex); + hdb_database_unlock (&handle_database->lock); return (0); } @@ -219,16 +289,16 @@ static inline int hdb_handle_destroy ( unsigned int handle = handle_in & 0xffffffff; int res; - pthread_mutex_lock (&handle_database->mutex); + hdb_database_lock (&handle_database->lock); if (check != 0xffffffff && check != handle_database->handles[handle].check) { - pthread_mutex_unlock (&handle_database->mutex); + hdb_database_unlock (&handle_database->lock); return (-1); } handle_database->handles[handle].state = HDB_HANDLE_STATE_PENDINGREMOVAL; - pthread_mutex_unlock (&handle_database->mutex); + hdb_database_unlock (&handle_database->lock); res = hdb_handle_put (handle_database, handle); return (res); } diff --git a/lcr/lcr_ifact.c b/lcr/lcr_ifact.c index 4e53e140..bcbc2004 100644 --- a/lcr/lcr_ifact.c +++ b/lcr/lcr_ifact.c @@ -61,6 +61,11 @@ struct lcr_iface_instance { void (*destructor) (void *context); }; +DECLARE_HDB_DATABASE_FIRSTRUN (lcr_component_instance_database); + +DECLARE_HDB_DATABASE_FIRSTRUN (lcr_iface_instance_database); + +/* static struct hdb_handle_database lcr_component_instance_database = { .handle_count = 0, .handles = 0, @@ -72,6 +77,7 @@ static struct hdb_handle_database lcr_iface_instance_database = { .handles = 0, .iterator = 0 }; +*/ static hdb_handle_t g_component_handle = 0xFFFFFFFF;