osaf/libs/core/mds/include/mds_core.h |   3 ++-
 osaf/libs/core/mds/mds_c_api.c        |  14 ++------------
 osaf/libs/core/mds/mds_c_db.c         |  35 ++++++++++++++++++++++++++++++-----
 osaf/libs/core/mds/mds_main.c         |  15 ++++++++++++---
 4 files changed, 46 insertions(+), 21 deletions(-)


The process_info_db needs to be available early before MDS is initialized. So
its initialization is moved to mds_auth_server_create(). The patricia tree
cannot be located in the control block which is dynamically created so it is
now statically allocated.

diff --git a/osaf/libs/core/mds/include/mds_core.h 
b/osaf/libs/core/mds/include/mds_core.h
--- a/osaf/libs/core/mds/include/mds_core.h
+++ b/osaf/libs/core/mds/include/mds_core.h
@@ -288,7 +288,6 @@ typedef struct mds_mcm_cb {
        NCS_PATRICIA_TREE subtn_results;
        NCS_PATRICIA_TREE svc_list;     /* Tree of MDS_SVC_INFO information */
        NCS_PATRICIA_TREE vdest_list;   /* Tree of MDS_VDEST_INFO information */
-       NCS_PATRICIA_TREE process_info_db; /* all known local MDS dests */
 } MDS_MCM_CB;
 
 /* Global MDSCB */
@@ -315,6 +314,8 @@ MDS_PROCESS_INFO *mds_process_info_get(M
 int mds_process_info_add(MDS_PROCESS_INFO *info);
 int mds_process_info_del(MDS_PROCESS_INFO *info);
 int mds_process_info_cnt(void);
+int mds_process_info_db_init(void);
+
 
 /* ******************************************** */
 /* ******************************************** */
diff --git a/osaf/libs/core/mds/mds_c_api.c b/osaf/libs/core/mds/mds_c_api.c
--- a/osaf/libs/core/mds/mds_c_api.c
+++ b/osaf/libs/core/mds/mds_c_api.c
@@ -2655,12 +2655,9 @@ else (entry exists)
 
        MDS_PROCESS_INFO *info = mds_process_info_get(adest);
        if (info != NULL) {
-               info->count--;
                TRACE("svc %d down cnt:%d, db cnt:%d", svc_id, info->count, 
mds_process_info_cnt());
-               if (info->count == 0) {
-                       mds_process_info_del(info);
-                       free(info);
-               }
+               mds_process_info_del(info);
+               free(info);
        }
 
        status = 
mds_svc_tbl_query(m_MDS_GET_PWE_HDL_FROM_SVC_HDL(local_svc_hdl),
@@ -3823,13 +3820,6 @@ uint32_t mds_mcm_init(void)
 
        ncs_patricia_tree_add(&gl_mds_mcm_cb->vdest_list, (NCS_PATRICIA_NODE 
*)vdest_for_adest_node);
 
-       memset(&pat_tree_params, 0, sizeof(pat_tree_params));
-       pat_tree_params.key_size = sizeof(MDS_DEST);
-       if (NCSCC_RC_SUCCESS != 
ncs_patricia_tree_init(&gl_mds_mcm_cb->process_info_db, &pat_tree_params)) {
-               m_MDS_LOG_ERR("MCM_API : patricia_tree_init:proc_info :failure, 
L mds_mcm_init");
-               return NCSCC_RC_FAILURE;
-       }
-
        return NCSCC_RC_SUCCESS;
 }
 
diff --git a/osaf/libs/core/mds/mds_c_db.c b/osaf/libs/core/mds/mds_c_db.c
--- a/osaf/libs/core/mds/mds_c_db.c
+++ b/osaf/libs/core/mds/mds_c_db.c
@@ -2331,17 +2331,27 @@ uint32_t mds_subtn_res_tbl_cleanup(void)
        return NCSCC_RC_SUCCESS;
 }
 
+/****************************************************************************/
+/* Process info database, stores mapping between mdsdest and pid
+ * Only used by some services. Tree itself cannot be located in control block
+ * which is dynamically allocated.
+ */
+
+static NCS_PATRICIA_TREE process_info_db; /* all known local MDS dests */
+
 MDS_PROCESS_INFO *mds_process_info_get(MDS_DEST mds_dest)
 {
-       return (MDS_PROCESS_INFO *) 
ncs_patricia_tree_get(&gl_mds_mcm_cb->process_info_db,
-               (uint8_t *)&mds_dest);
+       if (process_info_db.n_nodes > 0)
+               return (MDS_PROCESS_INFO *) 
ncs_patricia_tree_get(&process_info_db,
+                               (uint8_t *)&mds_dest);
+       return NULL;
 }
 
 int mds_process_info_add(MDS_PROCESS_INFO *info)
 {
        TRACE_ENTER2("dest:%lx, pid:%d", info->mds_dest, info->pid);
        info->patnode.key_info = (uint8_t *)&info->mds_dest;
-       int rc = ncs_patricia_tree_add(&gl_mds_mcm_cb->process_info_db,
+       int rc = ncs_patricia_tree_add(&process_info_db,
                   (NCS_PATRICIA_NODE *)&info->patnode);
        return rc;
 }
@@ -2349,14 +2359,29 @@ int mds_process_info_add(MDS_PROCESS_INF
 int mds_process_info_del(MDS_PROCESS_INFO *info)
 {
        TRACE_ENTER2("dest:%lx, pid:%d", info->mds_dest, info->pid);
-       int rc = ncs_patricia_tree_del(&gl_mds_mcm_cb->process_info_db,
+       int rc = ncs_patricia_tree_del(&process_info_db,
                   (NCS_PATRICIA_NODE *)&info->patnode);
        return rc;
 }
 
 int mds_process_info_cnt(void)
 {
-       return gl_mds_mcm_cb->process_info_db.n_nodes;
+       return process_info_db.n_nodes;
+}
+
+int mds_process_info_db_init(void)
+{
+       NCS_PATRICIA_PARAMS pat_tree_params = {0};
+
+       /* locking not needed */
+       pat_tree_params.key_size = sizeof(MDS_DEST);
+       if (NCSCC_RC_SUCCESS != ncs_patricia_tree_init(
+                       &process_info_db, &pat_tree_params)) {
+               syslog(LOG_ERR, "%s: patricia_tree_init failed", __FUNCTION__);
+               return NCSCC_RC_FAILURE;
+       }
+
+       return NCSCC_RC_SUCCESS;
 }
 
 /*********************************************************
diff --git a/osaf/libs/core/mds/mds_main.c b/osaf/libs/core/mds/mds_main.c
--- a/osaf/libs/core/mds/mds_main.c
+++ b/osaf/libs/core/mds/mds_main.c
@@ -153,18 +153,21 @@ static void mds_register_callback(int fd
 
        osaf_mutex_lock_ordie(&gl_mds_library_mutex);
 
-       if (mds_process_info_get(mds_dest) == NULL) {
+       MDS_PROCESS_INFO *info = mds_process_info_get(mds_dest);
+       if (info == NULL) {
                MDS_PROCESS_INFO *info = malloc(sizeof(MDS_PROCESS_INFO));
                osafassert(info);
                info->mds_dest = mds_dest;
                info->uid = creds->uid;
                info->pid = creds->pid;
                info->gid = creds->gid;
+               info->count = 1;
                int rc = mds_process_info_add(info);
                osafassert(rc == NCSCC_RC_SUCCESS);
        } else {
                /* this happens in clients that uses both OM and OI */
-               TRACE("dest %lx already exist", mds_dest);
+               info->count++;
+               TRACE("dest %lx already exist, cnt:%u", mds_dest, info->count);
        }
 
        osaf_mutex_unlock_ordie(&gl_mds_library_mutex);
@@ -188,8 +191,13 @@ static void mds_register_callback(int fd
  */
 int mds_auth_server_create(const char *name)
 {
+       if (mds_process_info_db_init() != NCSCC_RC_SUCCESS) {
+               syslog(LOG_ERR, "%s: mds_process_info_db_init failed", 
__FUNCTION__);
+               return NCSCC_RC_FAILURE;
+       }
+
        if (osaf_auth_server_create(name, mds_register_callback) != 0) {
-               syslog(LOG_ERR, "MDS_LIB_CREATE: osaf_auth_server_create 
failed");
+               syslog(LOG_ERR, "%s: osaf_auth_server_create failed", 
__FUNCTION__);
                return NCSCC_RC_FAILURE;
        }
 
@@ -233,6 +241,7 @@ int mds_auth_server_connect(const char *
                if (type != MDS_REGISTER_RESP) {
                        TRACE_3("wrong type %d", type);
                        rc = NCSCC_RC_FAILURE;
+                       goto fail;
                }
                int status = ncs_decode_32bit(&p);
                TRACE("received type:%d, status:%d", type, status);

------------------------------------------------------------------------------
Slashdot TV.  
Video for Nerds.  Stuff that matters.
http://tv.slashdot.org/
_______________________________________________
Opensaf-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/opensaf-devel

Reply via email to