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