hdb has some expense and is not necessary in the totempg.so runtime.  This
patch removes the dependence on hdb and instead uses a direct pointer.

Signed-off-by: Steven Dake <sd...@redhat.com>
---
 exec/main.c                      |    2 +-
 exec/sync.c                      |    2 +-
 exec/syncv2.c                    |    2 +-
 exec/totempg.c                   |  213 +++++++++++++-------------------------
 include/corosync/totem/totempg.h |   20 ++--
 5 files changed, 83 insertions(+), 156 deletions(-)

diff --git a/exec/main.c b/exec/main.c
index fde77da..582f1e2 100644
--- a/exec/main.c
+++ b/exec/main.c
@@ -244,7 +244,7 @@ static void sigabrt_handler (int num)
 
 #define LOCALHOST_IP inet_addr("127.0.0.1")
 
-static hdb_handle_t corosync_group_handle;
+static void *corosync_group_handle;
 
 static struct totempg_group corosync_group = {
        .group          = "a",
diff --git a/exec/sync.c b/exec/sync.c
index b9cc84a..ce99129 100644
--- a/exec/sync.c
+++ b/exec/sync.c
@@ -142,7 +142,7 @@ static struct totempg_group sync_group = {
     .group_len  = 4
 };
 
-static hdb_handle_t sync_group_handle;
+static void *sync_group_handle;
 
 struct req_exec_sync_barrier_start {
        struct qb_ipc_request_header header;
diff --git a/exec/syncv2.c b/exec/syncv2.c
index f9eebac..8a96615 100644
--- a/exec/syncv2.c
+++ b/exec/syncv2.c
@@ -167,7 +167,7 @@ static struct totempg_group sync_group = {
     .group_len  = 6
 };
 
-static hdb_handle_t sync_group_handle;
+static void *sync_group_handle;
 
 int sync_v2_init (
         int (*sync_callbacks_retrieve) (
diff --git a/exec/totempg.c b/exec/totempg.c
index c5ba01c..a3eee15 100644
--- a/exec/totempg.c
+++ b/exec/totempg.c
@@ -98,7 +98,6 @@
 #include <limits.h>
 
 #include <corosync/swab.h>
-#include <corosync/hdb.h>
 #include <corosync/list.h>
 #include <qb/qbloop.h>
 #include <qb/qbipcs.h>
@@ -212,6 +211,8 @@ DECLARE_LIST_INIT(assembly_list_inuse);
 
 DECLARE_LIST_INIT(assembly_list_free);
 
+DECLARE_LIST_INIT(totempg_groups_list);
+
 /*
  * Staging buffer for packed messages.  Messages are staged in this buffer
  * before sending.  Multiple messages may fit which cuts down on the
@@ -230,8 +231,6 @@ static int fragment_continuation = 0;
 
 static struct iovec iov_delv;
 
-static unsigned int totempg_max_handle = 0;
-
 struct totempg_group_instance {
        void (*deliver_fn) (
                unsigned int nodeid,
@@ -250,6 +249,8 @@ struct totempg_group_instance {
 
        int groups_cnt;
        int32_t q_level;
+
+       struct list_head list;
 };
 
 DECLARE_HDB_DATABASE (totempg_groups_instance_database,NULL);
@@ -342,7 +343,7 @@ static inline void app_confchg_fn (
        int i;
        struct totempg_group_instance *instance;
        struct assembly *assembly;
-       unsigned int res;
+       struct list_head *list;
 
        /*
         * For every leaving processor, add to free list
@@ -354,25 +355,23 @@ static inline void app_confchg_fn (
                list_del (&assembly->list);
                list_add (&assembly->list, &assembly_list_free);
        }
-       for (i = 0; i <= totempg_max_handle; i++) {
-               res = hdb_handle_get (&totempg_groups_instance_database,
-                       hdb_nocheck_convert (i), (void *)&instance);
-
-               if (res == 0) {
-                       if (instance->confchg_fn) {
-                               instance->confchg_fn (
-                                       configuration_type,
-                                       member_list,
-                                       member_list_entries,
-                                       left_list,
-                                       left_list_entries,
-                                       joined_list,
-                                       joined_list_entries,
-                                       ring_id);
-                       }
 
-                       hdb_handle_put (&totempg_groups_instance_database,
-                               hdb_nocheck_convert (i));
+       for (list = totempg_groups_list.next;
+               list != &totempg_groups_list;
+               list = list->next) {
+
+               instance = list_entry (list, struct totempg_group_instance, 
list);
+
+               if (instance->confchg_fn) {
+                       instance->confchg_fn (
+                               configuration_type,
+                               member_list,
+                               member_list_entries,
+                               left_list,
+                               left_list_entries,
+                               joined_list,
+                               joined_list_entries,
+                               ring_id);
                }
        }
 }
@@ -474,12 +473,11 @@ static inline void app_deliver_fn (
        unsigned int msg_len,
        int endian_conversion_required)
 {
-       int i;
        struct totempg_group_instance *instance;
        struct iovec stripped_iovec;
        unsigned int adjust_iovec;
-       unsigned int res;
        struct iovec *iovec;
+       struct list_head *list;
 
         struct iovec aligned_iovec = { NULL, 0 };
 
@@ -507,38 +505,35 @@ static inline void app_deliver_fn (
 
        iovec = &aligned_iovec;
 
-       for (i = 0; i <= totempg_max_handle; i++) {
-               res = hdb_handle_get (&totempg_groups_instance_database,
-                       hdb_nocheck_convert (i), (void *)&instance);
+       for (list = totempg_groups_list.next;
+               list != &totempg_groups_list;
+               list = list->next) {
 
-               if (res == 0) {
-                       if (group_matches (iovec, 1, instance->groups, 
instance->groups_cnt, &adjust_iovec)) {
-                               stripped_iovec.iov_len = iovec->iov_len - 
adjust_iovec;
-                               stripped_iovec.iov_base = (char 
*)iovec->iov_base + adjust_iovec;
+               instance = list_entry (list, struct totempg_group_instance, 
list);
+               if (group_matches (iovec, 1, instance->groups, 
instance->groups_cnt, &adjust_iovec)) {
+                       stripped_iovec.iov_len = iovec->iov_len - adjust_iovec;
+                       stripped_iovec.iov_base = (char *)iovec->iov_base + 
adjust_iovec;
 
 #ifdef TOTEMPG_NEED_ALIGN
+                       /*
+                        * Align data structure for not i386 or x86_64
+                        */
+                       if ((char *)iovec->iov_base + adjust_iovec % 4 != 0) {
                                /*
-                                * Align data structure for not i386 or x86_64
+                                * Deal with misalignment
                                 */
-                               if ((char *)iovec->iov_base + adjust_iovec % 4 
!= 0) {
-                                       /*
-                                        * Deal with misalignment
-                                        */
-                                       stripped_iovec.iov_base =
-                                               alloca (stripped_iovec.iov_len);
-                                       memcpy (stripped_iovec.iov_base,
-                                                (char *)iovec->iov_base + 
adjust_iovec,
-                                               stripped_iovec.iov_len);
-                               }
-#endif
-                               instance->deliver_fn (
-                                       nodeid,
-                                       stripped_iovec.iov_base,
-                                       stripped_iovec.iov_len,
-                                       endian_conversion_required);
+                               stripped_iovec.iov_base =
+                                       alloca (stripped_iovec.iov_len);
+                               memcpy (stripped_iovec.iov_base,
+                                        (char *)iovec->iov_base + adjust_iovec,
+                                       stripped_iovec.iov_len);
                        }
-
-                       hdb_handle_put (&totempg_groups_instance_database, 
hdb_nocheck_convert(i));
+#endif
+                       instance->deliver_fn (
+                               nodeid,
+                               stripped_iovec.iov_base,
+                               stripped_iovec.iov_len,
+                               endian_conversion_required);
                }
        }
 }
@@ -779,6 +774,8 @@ int totempg_initialize (
                (totempg_totem_config->net_mtu -
                sizeof (struct totempg_mcast) - 16);
 
+       list_init (&totempg_groups_list);
+
        return (res);
 }
 
@@ -1052,7 +1049,7 @@ void totempg_callback_token_destroy (
  */
 
 int totempg_groups_initialize (
-       hdb_handle_t *handle,
+       void **totempg_groups_instance,
 
        void (*deliver_fn) (
                unsigned int nodeid,
@@ -1068,42 +1065,29 @@ int totempg_groups_initialize (
                const struct memb_ring_id *ring_id))
 {
        struct totempg_group_instance *instance;
-       unsigned int res;
 
        if (totempg_threaded_mode == 1) {
                pthread_mutex_lock (&totempg_mutex);
        }
-       res = hdb_handle_create (&totempg_groups_instance_database,
-               sizeof (struct totempg_group_instance), handle);
-       if (res != 0) {
+       
+       instance = malloc (sizeof (struct totempg_group_instance));
+       if (instance == NULL) {
                goto error_exit;
        }
 
-       if (*handle > totempg_max_handle) {
-               totempg_max_handle = *handle;
-       }
-
-       res = hdb_handle_get (&totempg_groups_instance_database, *handle,
-               (void *)&instance);
-       if (res != 0) {
-               goto error_destroy;
-       }
-
        instance->deliver_fn = deliver_fn;
        instance->confchg_fn = confchg_fn;
        instance->groups = 0;
        instance->groups_cnt = 0;
        instance->q_level = QB_LOOP_MED;
-
-
-       hdb_handle_put (&totempg_groups_instance_database, *handle);
+       list_init (&instance->list);
+       list_add (&instance->list, &totempg_groups_list);
 
        if (totempg_threaded_mode == 1) {
                pthread_mutex_unlock (&totempg_mutex);
        }
+       *totempg_groups_instance = instance;
        return (0);
-error_destroy:
-       hdb_handle_destroy (&totempg_groups_instance_database, *handle);
 
 error_exit:
        if (totempg_threaded_mode == 1) {
@@ -1113,11 +1097,11 @@ error_exit:
 }
 
 int totempg_groups_join (
-       hdb_handle_t handle,
+       void *totempg_groups_instance,
        const struct totempg_group *groups,
        size_t group_cnt)
 {
-       struct totempg_group_instance *instance;
+       struct totempg_group_instance *instance = (struct 
totempg_group_instance *)totempg_groups_instance;
        struct totempg_group *new_groups;
        unsigned int res;
 
@@ -1125,12 +1109,6 @@ int totempg_groups_join (
                pthread_mutex_lock (&totempg_mutex);
        }
        
-       res = hdb_handle_get (&totempg_groups_instance_database, handle,
-               (void *)&instance);
-       if (res != 0) {
-               goto error_exit;
-       }
-
        new_groups = realloc (instance->groups,
                sizeof (struct totempg_group) *
                (instance->groups_cnt + group_cnt));
@@ -1143,8 +1121,6 @@ int totempg_groups_join (
        instance->groups = new_groups;
        instance->groups_cnt += group_cnt;
 
-       hdb_handle_put (&totempg_groups_instance_database, handle);
-
 error_exit:
        if (totempg_threaded_mode == 1) {
                pthread_mutex_unlock (&totempg_mutex);
@@ -1153,41 +1129,30 @@ error_exit:
 }
 
 int totempg_groups_leave (
-       hdb_handle_t handle,
+       void *totempg_groups_instance,
        const struct totempg_group *groups,
        size_t group_cnt)
 {
-       struct totempg_group_instance *instance;
-       unsigned int res;
-
        if (totempg_threaded_mode == 1) {
                pthread_mutex_lock (&totempg_mutex);
        }
-       res = hdb_handle_get (&totempg_groups_instance_database, handle,
-               (void *)&instance);
-       if (res != 0) {
-               goto error_exit;
-       }
 
-       hdb_handle_put (&totempg_groups_instance_database, handle);
-
-error_exit:
        if (totempg_threaded_mode == 1) {
                pthread_mutex_unlock (&totempg_mutex);
        }
-       return (res);
+       return (0);
 }
 
 #define MAX_IOVECS_FROM_APP 32
 #define MAX_GROUPS_PER_MSG 32
 
 int totempg_groups_mcast_joined (
-       hdb_handle_t handle,
+       void *totempg_groups_instance,
        const struct iovec *iovec,
        unsigned int iov_len,
        int guarantee)
 {
-       struct totempg_group_instance *instance;
+       struct totempg_group_instance *instance = (struct 
totempg_group_instance *)totempg_groups_instance;
        unsigned short group_len[MAX_GROUPS_PER_MSG + 1];
        struct iovec iovec_mcast[MAX_GROUPS_PER_MSG + 1 + MAX_IOVECS_FROM_APP];
        int i;
@@ -1197,12 +1162,6 @@ int totempg_groups_mcast_joined (
                pthread_mutex_lock (&totempg_mutex);
        }
        
-       res = hdb_handle_get (&totempg_groups_instance_database, handle,
-               (void *)&instance);
-       if (res != 0) {
-               goto error_exit;
-       }
-
        /*
         * Build group_len structure and the iovec_mcast structure
         */
@@ -1220,9 +1179,7 @@ int totempg_groups_mcast_joined (
        }
 
        res = mcast_msg (iovec_mcast, iov_len + instance->groups_cnt + 1, 
guarantee);
-       hdb_handle_put (&totempg_groups_instance_database, handle);
 
-error_exit:
        if (totempg_threaded_mode == 1) {
                pthread_mutex_unlock (&totempg_mutex);
        }
@@ -1230,10 +1187,12 @@ error_exit:
        return (res);
 }
 
-static void check_q_level(struct totempg_group_instance *instance)
+static void check_q_level(
+       void *totempg_groups_instance)
 {
        int32_t old_level;
        int32_t percent_used = 0;
+       struct totempg_group_instance *instance = (struct 
totempg_group_instance *)totempg_groups_instance;
 
        old_level = instance->q_level;
        percent_used = 100 - (totemmrp_avail () * 100 / 800); 
/*(1024*1024/1500)*/
@@ -1253,39 +1212,28 @@ static void check_q_level(struct totempg_group_instance 
*instance)
 
 }
 
-void totempg_check_q_level(qb_handle_t handle)
+void totempg_check_q_level(
+       void *totempg_groups_instance)
 {
-       struct totempg_group_instance *instance;
+       struct totempg_group_instance *instance = (struct 
totempg_group_instance *)totempg_groups_instance;
 
-       if (hdb_handle_get (&totempg_groups_instance_database, handle,
-                       (void *)&instance) != 0) {
-               return;
-       }
        check_q_level(instance);
-
-       hdb_handle_put (&totempg_groups_instance_database, handle);
 }
 
 int totempg_groups_joined_reserve (
-       hdb_handle_t handle,
+       void *totempg_groups_instance,
        const struct iovec *iovec,
        unsigned int iov_len)
 {
-       struct totempg_group_instance *instance;
+       struct totempg_group_instance *instance = (struct 
totempg_group_instance *)totempg_groups_instance;
        unsigned int size = 0;
        unsigned int i;
-       unsigned int res;
        unsigned int reserved = 0;
 
        if (totempg_threaded_mode == 1) {
                pthread_mutex_lock (&totempg_mutex);
                pthread_mutex_lock (&mcast_msg_mutex);
        }
-       res = hdb_handle_get (&totempg_groups_instance_database, handle,
-               (void *)&instance);
-       if (res != 0) {
-               goto error_exit;
-       }
 
        for (i = 0; i < instance->groups_cnt; i++) {
                size += instance->groups[i].group_len;
@@ -1297,7 +1245,7 @@ int totempg_groups_joined_reserve (
 
        if (size >= totempg_size_limit) {
                reserved = -1;
-               goto error_put;
+               goto error_exit;
        }
 
        reserved = send_reserve (size);
@@ -1306,8 +1254,6 @@ int totempg_groups_joined_reserve (
                reserved = 0;
        }
 
-error_put:
-       hdb_handle_put (&totempg_groups_instance_database, handle);
 
 error_exit:
        if (totempg_threaded_mode == 1) {
@@ -1333,14 +1279,13 @@ int totempg_groups_joined_release (int msg_count)
 }
 
 int totempg_groups_mcast_groups (
-       hdb_handle_t handle,
+       void *totempg_groups_instance,
        int guarantee,
        const struct totempg_group *groups,
        size_t groups_cnt,
        const struct iovec *iovec,
        unsigned int iov_len)
 {
-       struct totempg_group_instance *instance;
        unsigned short group_len[MAX_GROUPS_PER_MSG + 1];
        struct iovec iovec_mcast[MAX_GROUPS_PER_MSG + 1 + MAX_IOVECS_FROM_APP];
        int i;
@@ -1349,11 +1294,6 @@ int totempg_groups_mcast_groups (
        if (totempg_threaded_mode == 1) {
                pthread_mutex_lock (&totempg_mutex);
        }
-       res = hdb_handle_get (&totempg_groups_instance_database, handle,
-               (void *)&instance);
-       if (res != 0) {
-               goto error_exit;
-       }
 
        /*
         * Build group_len structure and the iovec_mcast structure
@@ -1373,9 +1313,6 @@ int totempg_groups_mcast_groups (
 
        res = mcast_msg (iovec_mcast, iov_len + groups_cnt + 1, guarantee);
 
-       hdb_handle_put (&totempg_groups_instance_database, handle);
-
-error_exit:
        if (totempg_threaded_mode == 1) {
                pthread_mutex_unlock (&totempg_mutex);
        }
@@ -1386,13 +1323,12 @@ error_exit:
  * Returns -1 if error, 0 if can't send, 1 if can send the message
  */
 int totempg_groups_send_ok_groups (
-       hdb_handle_t handle,
+       void *totempg_groups_instance,
        const struct totempg_group *groups,
        size_t groups_cnt,
        const struct iovec *iovec,
        unsigned int iov_len)
 {
-       struct totempg_group_instance *instance;
        unsigned int size = 0;
        unsigned int i;
        unsigned int res;
@@ -1400,11 +1336,6 @@ int totempg_groups_send_ok_groups (
        if (totempg_threaded_mode == 1) {
                pthread_mutex_lock (&totempg_mutex);
        }
-       res = hdb_handle_get (&totempg_groups_instance_database, handle,
-               (void *)&instance);
-       if (res != 0) {
-               goto error_exit;
-       }
 
        for (i = 0; i < groups_cnt; i++) {
                size += groups[i].group_len;
@@ -1415,8 +1346,6 @@ int totempg_groups_send_ok_groups (
 
        res = msg_count_send_ok (size);
 
-       hdb_handle_put (&totempg_groups_instance_database, handle);
-error_exit:
        if (totempg_threaded_mode == 1) {
                pthread_mutex_unlock (&totempg_mutex);
        }
diff --git a/include/corosync/totem/totempg.h b/include/corosync/totem/totempg.h
index 30ccfe4..9fda82e 100644
--- a/include/corosync/totem/totempg.h
+++ b/include/corosync/totem/totempg.h
@@ -49,7 +49,6 @@ extern "C" {
 
 #include <netinet/in.h>
 #include "totem.h"
-#include <corosync/hdb.h>
 #include <qb/qbloop.h>
 
 struct totempg_group {
@@ -82,7 +81,7 @@ extern void totempg_callback_token_destroy (void *handle);
  * Initialize a groups instance
  */
 extern int totempg_groups_initialize (
-       hdb_handle_t *handle,
+       void **instance,
 
        void (*deliver_fn) (
                unsigned int nodeid,
@@ -97,27 +96,26 @@ extern int totempg_groups_initialize (
                const unsigned int *joined_list, size_t joined_list_entries,
                const struct memb_ring_id *ring_id));
 
-extern int totempg_groups_finalize (
-       hdb_handle_t handle);
+extern int totempg_groups_finalize (void *instance);
 
 extern int totempg_groups_join (
-       hdb_handle_t handle,
+       void *instance,
        const struct totempg_group *groups,
        size_t group_cnt);
 
 extern int totempg_groups_leave (
-       hdb_handle_t handle,
+       void *instance,
        const struct totempg_group *groups,
        size_t group_cnt);
 
 extern int totempg_groups_mcast_joined (
-       hdb_handle_t handle,
+       void *instance,
        const struct iovec *iovec,
        unsigned int iov_len,
        int guarantee);
 
 extern int totempg_groups_joined_reserve (
-       hdb_handle_t handle,
+       void *instance,
        const struct iovec *iovec,
        unsigned int iov_len);
 
@@ -125,7 +123,7 @@ extern int totempg_groups_joined_release (
        int msg_count);
 
 extern int totempg_groups_mcast_groups (
-       hdb_handle_t handle,
+       void *instance,
        int guarantee,
        const struct totempg_group *groups,
        size_t groups_cnt,
@@ -133,7 +131,7 @@ extern int totempg_groups_mcast_groups (
        unsigned int iov_len);
 
 extern int totempg_groups_send_ok_groups (
-       hdb_handle_t handle,
+       void *instance,
        const struct totempg_group *groups,
        size_t groups_cnt,
        const struct iovec *iovec,
@@ -177,7 +175,7 @@ enum totem_q_level {
        TOTEM_Q_LEVEL_CRITICAL
 };
 
-void totempg_check_q_level(hdb_handle_t handle);
+void totempg_check_q_level(void *instance);
 
 typedef void (*totem_queue_level_changed_fn) (enum totem_q_level level);
 extern void totempg_queue_level_register_callback 
(totem_queue_level_changed_fn);
-- 
1.7.6

_______________________________________________
Openais mailing list
Openais@lists.linux-foundation.org
https://lists.linux-foundation.org/mailman/listinfo/openais

Reply via email to