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

Reply via email to