Appropriate global variables in smfnd are placed under mutex
protection: smfnd_cb_t::smfd_dest, smfnd_cb_t::agent_cnt
---
src/smf/smfnd/smfnd.h | 1 +
src/smf/smfnd/smfnd_evt.c | 7 +++++++
src/smf/smfnd/smfnd_mds.c | 9 +++++++++
3 files changed, 17 insertions(+)
diff --git a/src/smf/smfnd/smfnd.h b/src/smf/smfnd/smfnd.h
index 947745a40..d5c4ac81b 100644
--- a/src/smf/smfnd/smfnd.h
+++ b/src/smf/smfnd/smfnd.h
@@ -66,6 +66,7 @@ typedef struct {
*cbk_list; /* Mapping between inv_id and all the agents */
uint32_t agent_cnt; /* Count of SMF Agents */
MDS_DEST smfd_dest; /* MDS DEST of SMFD */
+ pthread_mutex_t cb_lock; /* Used by smfnd_cb_t lock/unlock functions */
} smfnd_cb_t;
extern smfnd_cb_t *smfnd_cb;
diff --git a/src/smf/smfnd/smfnd_evt.c b/src/smf/smfnd/smfnd_evt.c
index 552e11a37..48015fd5b 100644
--- a/src/smf/smfnd/smfnd_evt.c
+++ b/src/smf/smfnd/smfnd_evt.c
@@ -22,6 +22,7 @@
#include "smfnd.h"
#include "smf/common/smfsv_defs.h"
#include "smf/common/smfsv_evt.h"
+#include "base/osaf_utility.h"
/* This function is called in another threads context so be
careful with what you do here */
@@ -417,10 +418,12 @@ uint32_t smfnd_cbk_resp_err_proc(smfnd_cb_t *cb,
SaInvocationT inv_id)
resp_evt.info.smfd.event.cbk_rsp.evt.resp_evt
.err = SA_AIS_ERR_FAILED_OPERATION;
+ osaf_mutex_lock_ordie(&cb->cb_lock);
rc = smfsv_mds_msg_send(
cb->mds_handle, NCSMDS_SVC_ID_SMFD,
cb->smfd_dest, NCSMDS_SVC_ID_SMFND,
&resp_evt);
+ osaf_mutex_unlock_ordie(&cb->cb_lock);
}
break;
}
@@ -474,10 +477,12 @@ uint32_t smfnd_cbk_resp_ok_proc(smfnd_cb_t *cb,
SaInvocationT inv_id,
resp_evt.info.smfd.event.cbk_rsp.evt
.resp_evt.err = resp;
+ osaf_mutex_lock_ordie(&cb->cb_lock);
rc = smfsv_mds_msg_send(
cb->mds_handle, NCSMDS_SVC_ID_SMFD,
cb->smfd_dest, NCSMDS_SVC_ID_SMFND,
&resp_evt);
+ osaf_mutex_unlock_ordie(&cb->cb_lock);
}
/* Send resp to SMFD and break.*/
break;
@@ -536,7 +541,9 @@ static void proc_cbk_req_rsp(smfnd_cb_t *cb, SMFSV_EVT *evt)
TRACE_ENTER();
switch (evt->info.smfnd.event.cbk_req_rsp.evt_type) {
case SMF_CLBK_EVT: {
+ osaf_mutex_lock_ordie(&cb->cb_lock);
smfnd_cbk_req_proc(cb, evt);
+ osaf_mutex_unlock_ordie(&cb->cb_lock);
break;
}
case SMF_RSP_EVT: {
diff --git a/src/smf/smfnd/smfnd_mds.c b/src/smf/smfnd/smfnd_mds.c
index b49f5f1bd..8298bb4ca 100644
--- a/src/smf/smfnd/smfnd_mds.c
+++ b/src/smf/smfnd/smfnd_mds.c
@@ -19,6 +19,7 @@
#include "smfnd.h"
#include "smf/common/smfsv_evt.h"
+#include "base/osaf_utility.h"
uint32_t mds_register(smfnd_cb_t *cb);
void mds_unregister(smfnd_cb_t *cb);
@@ -242,14 +243,18 @@ static uint32_t mds_svc_event(struct ncsmds_callback_info
*info)
case NCSMDS_UP:
/* TODO: No lock is taken. This might be dangerous.*/
if (NCSMDS_SVC_ID_SMFA == svc_evt->i_svc_id) {
+ osaf_mutex_lock_ordie(&cb->cb_lock);
cb->agent_cnt++;
+ osaf_mutex_unlock_ordie(&cb->cb_lock);
TRACE("Count of agents incremeted to : %d",
cb->agent_cnt);
} else if (NCSMDS_SVC_ID_SMFD == svc_evt->i_svc_id) {
/* Catch the vdest of SMFD*/
if (m_MDS_DEST_IS_AN_ADEST(svc_evt->i_dest))
return NCSCC_RC_SUCCESS;
+ osaf_mutex_lock_ordie(&cb->cb_lock);
cb->smfd_dest = svc_evt->i_dest;
+ osaf_mutex_unlock_ordie(&cb->cb_lock);
LOG_NO("MDS %s: NCSMDS_SVC_ID_SMFD "
"dest = 0x%" PRIx64,
__FUNCTION__, svc_evt->i_dest);
@@ -263,13 +268,17 @@ static uint32_t mds_svc_event(struct ncsmds_callback_info
*info)
agents, not the adest of agents and hence it is not possible to
clean up cbk_list.*/
if (NCSMDS_SVC_ID_SMFA == svc_evt->i_svc_id) {
+ osaf_mutex_lock_ordie(&cb->cb_lock);
cb->agent_cnt--;
+ osaf_mutex_unlock_ordie(&cb->cb_lock);
TRACE("Count of agents decremeted to : %d",
cb->agent_cnt);
} else if (NCSMDS_SVC_ID_SMFD == svc_evt->i_svc_id) {
if (m_MDS_DEST_IS_AN_ADEST(svc_evt->i_dest))
return NCSCC_RC_SUCCESS;
+ osaf_mutex_lock_ordie(&cb->cb_lock);
cb->smfd_dest = 0;
+ osaf_mutex_unlock_ordie(&cb->cb_lock);
LOG_NO("MDS %s: NCSMDS_DOWN smfd_dest = 0",
__FUNCTION__);
}
--
2.25.0
_______________________________________________
Opensaf-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/opensaf-devel