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 Opensaf-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/opensaf-devel