Hi,

According to the patch (I haven't checked the code), I don't see the reason for 
using rwlock. Pthread mutex will even work better than rwlock in the patch.

Reasons for using mutex:
1. Mutex is much faster than rwlock in Linux, around 10 times faster, if I 
remember correctly
2. Here, we are talking about two threads, and not more.
3. rwlock has never been used in OpenSAF before.

BR,
Zoran

-----Original Message-----
From: Hoa Le [mailto:[email protected]] 
Sent: den 21 mars 2018 11:34
To: Anders Widell <[email protected]>; Hans Nordebäck 
<[email protected]>
Cc: [email protected]
Subject: [devel] [PATCH 1/1] mds: improve thread safety in mdstest [#2746]

- Correct helgrind issues in mds/apitest
---
 src/mds/apitest/mdstest.c      |   7 +-
 src/mds/apitest/mdstipc.h      |   7 +-
 src/mds/apitest/mdstipc_api.c  | 196 +++++++++++++++++++++++++++++++++--------
 src/mds/apitest/mdstipc_conf.c |  89 +++++++++++++------
 4 files changed, 234 insertions(+), 65 deletions(-)

diff --git a/src/mds/apitest/mdstest.c b/src/mds/apitest/mdstest.c
index bf6e173..3280e5b 100644
--- a/src/mds/apitest/mdstest.c
+++ b/src/mds/apitest/mdstest.c
@@ -35,6 +35,7 @@
 //#include "mdstest.h"
 
 SaAisErrorT rc;
+pthread_rwlock_t gl_lock;
 
 int mds_startup(void)
 {
@@ -83,13 +84,17 @@ int main(int argc, char **argv)
        if (suite == 999) {
                return 0;
        }
-
        if (mds_startup() != 0) {
                printf("Fail to start mds agents\n");
                return 1;
        }
 
+       pthread_rwlock_init(&gl_lock, NULL);
+
        int rc = test_run(suite, tcase);
+
+       pthread_rwlock_destroy(&gl_lock);
+
        mds_shutdown();
        return rc;
 }
diff --git a/src/mds/apitest/mdstipc.h b/src/mds/apitest/mdstipc.h
index fbb6468..9e93a17 100644
--- a/src/mds/apitest/mdstipc.h
+++ b/src/mds/apitest/mdstipc.h
@@ -145,13 +145,12 @@ typedef struct tet_mds_recvd_msg_info {
 } TET_MDS_RECVD_MSG_INFO;
 
 /********************* GLOBAL variables ********************/
+extern _Thread_local NCSMDS_INFO svc_to_mds_info;
+extern pthread_rwlock_t gl_lock;
+
 TET_ADEST gl_tet_adest;
 TET_VDEST
     gl_tet_vdest[4]; /*change it to 6 to run VDS Redundancy: 101 for Stress*/
-NCSADA_INFO ada_info;
-NCSVDA_INFO vda_info;
-NCSMDS_INFO svc_to_mds_info;
-TET_EVENT_INFO gl_event_data;
 TET_SVC gl_tet_svc;
 TET_MDS_RECVD_MSG_INFO gl_rcvdmsginfo, gl_direct_rcvmsginfo;
 int gl_vdest_indx;
diff --git a/src/mds/apitest/mdstipc_api.c b/src/mds/apitest/mdstipc_api.c
index 5eb8bd9..3a98ecd 100644
--- a/src/mds/apitest/mdstipc_api.c
+++ b/src/mds/apitest/mdstipc_api.c
@@ -33,6 +33,28 @@ static MDS_CLIENT_MSG_FORMAT_VER gl_set_msg_fmt_ver;
 
 MDS_SVC_ID svc_ids[3] = {2006, 2007, 2008};
 
+pthread_mutex_t safe_printf_mutex = PTHREAD_MUTEX_INITIALIZER;
+_Thread_local NCSMDS_INFO svc_to_mds_info;
+
+void safe_printf(const char* format, ... ) {
+       pthread_mutex_lock(&safe_printf_mutex);
+       va_list args;
+       va_start(args, format);
+       vfprintf(stdout, format, args);
+       va_end(args);
+       pthread_mutex_unlock(&safe_printf_mutex);
+}
+int safe_fflush(FILE *stream) {
+       int rc = 0;
+       pthread_mutex_lock(&safe_printf_mutex);
+       rc = fflush(stream);
+       pthread_mutex_unlock(&safe_printf_mutex);
+       return rc;
+}
+
+#define printf safe_printf
+#define fflush safe_fflush
+
 /*****************************************************************************/
 /************        SERVICE API TEST CASES   ********************************/
 /*****************************************************************************/
@@ -363,6 +385,7 @@ void tet_svc_install_tp_10()
 {
        int FAIL = 0;
        SaUint32T rc;
+       NCSCONTEXT t_handle = 0;
        // Creating a MxN VDEST with id = 2000
        rc = create_vdest(NCS_VDEST_TYPE_MxN, 2000);
        if (rc != NCSCC_RC_SUCCESS) {
@@ -373,25 +396,25 @@ void tet_svc_install_tp_10()
        printf(
            "\nTest case 10:Installing the External MIN service EXTMIN in a 
seperate thread and Uninstalling it here\n");
        // Install thread
-       rc = tet_create_task((NCS_OS_CB)tet_vdest_install_thread,
-                            gl_tet_vdest[0].svc[0].task.t_handle);
+       rc = tet_create_task((NCS_OS_CB)tet_vdest_install_thread, t_handle);
        if (rc != NCSCC_RC_SUCCESS) {
                printf("\nFail to Install thread\n");
                FAIL = 1;
        }
-
        // Now Release the Install Thread
-       rc = tet_release_task(gl_tet_vdest[0].svc[0].task.t_handle);
+       rc = tet_release_task(t_handle);
        if (rc != NCSCC_RC_SUCCESS) {
                printf("\nFail to release thread\n");
                FAIL = 1;
        }
 
        // Counter shall be != 0
+       pthread_rwlock_rdlock(&gl_lock);
        if (gl_tet_vdest[0].svc_count == 0) {
                printf("\nsvc_count == 0\n");
                FAIL = 1;
        };
+       pthread_rwlock_unlock(&gl_lock);
 
        // Uninstalling the above service
        rc = mds_service_uninstall(gl_tet_vdest[0].mds_pwe1_hdl,
@@ -809,8 +832,7 @@ void tet_vdest_uninstall_thread()
 {
        // Inside Thread
        printf("tet_vdest_uninstall_thread\n");
-       test_validate(mds_service_uninstall(gl_tet_vdest[0].mds_pwe1_hdl, 500),
-                     NCSCC_RC_SUCCESS);
+       mds_service_uninstall(gl_tet_vdest[0].mds_pwe1_hdl, 500);
 }
 
 void tet_svc_unstall_tp_1()
@@ -989,11 +1011,13 @@ void tet_svc_unstall_tp_5()
        }
 
        // Test gl_tet_vdest[0].svc_count == 0
+       pthread_rwlock_rdlock(&gl_lock);
        if (gl_tet_vdest[0].svc_count != 0) {
                printf("\nsvc_count is %d, should be 0\n",
                       gl_tet_vdest[0].svc_count);
                FAIL = 1;
        }
+       pthread_rwlock_unlock(&gl_lock);
 
        // Destroying a MxN VDEST with id = 1001
        rc = destroy_vdest(1001);
@@ -2425,11 +2449,13 @@ void tet_svc_subscr_ADEST_8()
                    NCSCC_RC_SUCCESS) {
                        printf("\nTASK is released\n");
                }
+               pthread_rwlock_rdlock(&gl_lock);
                if (gl_tet_adest.svc[0].subscr_count) {
                        printf("Cancel Fail\n");
                        FAIL = 1;
                } else
                        printf("\nSuccess\n");
+               pthread_rwlock_unlock(&gl_lock);
        }
 
        // clean up
@@ -4636,7 +4662,7 @@ void tet_query_pwe_tp_3()
 void tet_adest_rcvr_thread()
 {
        MDS_SVC_ID svc_id;
-       int FAIL = 0;
+       bool rsp_reqd = false;
        char tmp[] = " Hi Sender! My Name is RECEIVER ";
        TET_MDS_MSG *mesg;
        mesg = (TET_MDS_MSG *)malloc(sizeof(TET_MDS_MSG));
@@ -4653,29 +4679,32 @@ void tet_adest_rcvr_thread()
                                         NCSMDS_SVC_ID_EXTERNAL_MIN,
                                         SA_DISPATCH_ALL) != NCSCC_RC_SUCCESS) {
                        printf("Fail mds_service_retrieve\n");
-                       FAIL = 1;
                }
 
                /*after that send a response to the sender, if it expects*/
-               if (gl_rcvdmsginfo.rsp_reqd) {
+               pthread_rwlock_rdlock(&gl_lock);
+               rsp_reqd = gl_rcvdmsginfo.rsp_reqd;
+               pthread_rwlock_unlock(&gl_lock);
+               if (rsp_reqd) {
                        if (mds_send_response(gl_tet_adest.pwe[0].mds_pwe_hdl,
                                              NCSMDS_SVC_ID_EXTERNAL_MIN,
                                              mesg) != NCSCC_RC_SUCCESS) {
                                printf("Response Fail\n");
-                               FAIL = 1;
                        } else
                                printf("Response Success\n");
+                       pthread_rwlock_wrlock(&gl_lock);
                        gl_rcvdmsginfo.rsp_reqd = 0;
+                       pthread_rwlock_unlock(&gl_lock);
                }
        }
 
        free(mesg);
-       test_validate(FAIL, 0);
 }
 
 void tet_adest_rcvr_svc_thread()
 {
        MDS_SVC_ID svc_id;
+       bool rsp_reqd = false;
        char tmp[] = " Hi Sender! My Name is RECEIVER ";
        TET_MDS_MSG *mesg;
        mesg = (TET_MDS_MSG *)malloc(sizeof(TET_MDS_MSG));
@@ -4695,14 +4724,19 @@ void tet_adest_rcvr_svc_thread()
                        printf("Fail mds_service_retrieve\n");
                }
                /*after that send a response to the sender, if it expects*/
-               if (gl_rcvdmsginfo.rsp_reqd) {
+               pthread_rwlock_rdlock(&gl_lock);
+               rsp_reqd = gl_rcvdmsginfo.rsp_reqd;
+               pthread_rwlock_unlock(&gl_lock);
+               if (rsp_reqd) {
                        if (mds_send_response(gl_tet_adest.mds_pwe1_hdl,
                                              NCSMDS_SVC_ID_EXTERNAL_MIN,
                                              mesg) != NCSCC_RC_SUCCESS) {
                                printf("Response Fail\n");
                        } else
                                printf("Response Success\n");
+                       pthread_rwlock_wrlock(&gl_lock);
                        gl_rcvdmsginfo.rsp_reqd = 0;
+                       pthread_rwlock_unlock(&gl_lock);
                }
        }
 
@@ -4712,6 +4746,7 @@ void tet_adest_rcvr_svc_thread()
 void tet_vdest_rcvr_resp_thread()
 {
        MDS_SVC_ID svc_id;
+       bool rsp_reqd = false;
        char tmp[] = " Hi Sender! My Name is RECEIVER ";
        TET_MDS_MSG *mesg;
        mesg = (TET_MDS_MSG *)malloc(sizeof(TET_MDS_MSG));
@@ -4728,7 +4763,10 @@ void tet_vdest_rcvr_resp_thread()
                        printf("Fail mds_service_retrieve\n");
                }
                /*after that send a response to the sender, if it expects*/
-               if (gl_rcvdmsginfo.rsp_reqd) {
+               pthread_rwlock_rdlock(&gl_lock);
+               rsp_reqd = gl_rcvdmsginfo.rsp_reqd;
+               pthread_rwlock_unlock(&gl_lock);
+               if (rsp_reqd) {
                        if (mds_send_response(gl_tet_vdest[1].mds_pwe1_hdl,
                                              NCSMDS_SVC_ID_EXTERNAL_MIN,
                                              mesg) != NCSCC_RC_SUCCESS) {
@@ -5571,6 +5609,7 @@ TODO: Check this testcase, it was outcomment already in 
the "tet"-files
 void tet_vdest_rcvr_thread()
 {
        MDS_SVC_ID svc_id;
+       bool rsp_reqd = false;
        char tmp[] = " Yes Sender! I am in. Message Delivered?";
        TET_MDS_MSG *mesg;
        mesg = (TET_MDS_MSG *)malloc(sizeof(TET_MDS_MSG));
@@ -5588,14 +5627,19 @@ void tet_vdest_rcvr_thread()
                }
 
                /*after that send a response to the sender, if it expects*/
-               if (gl_rcvdmsginfo.rsp_reqd) {
+               pthread_rwlock_rdlock(&gl_lock);
+               rsp_reqd = gl_rcvdmsginfo.rsp_reqd;
+               pthread_rwlock_unlock(&gl_lock);
+               if (rsp_reqd) {
                        if (mds_sendrsp_getack(gl_tet_vdest[1].mds_pwe1_hdl,
                                               NCSMDS_SVC_ID_EXTERNAL_MIN, 0,
                                               mesg) != NCSCC_RC_SUCCESS) {
                                printf("Response Fail\n");
                        } else
                                printf("Response Ack Success\n");
+                       pthread_rwlock_wrlock(&gl_lock);
                        gl_rcvdmsginfo.rsp_reqd = 0;
+                       pthread_rwlock_unlock(&gl_lock);
                        
/*if(mds_send_redrsp_getack(gl_tet_vdest[1].mds_pwe1_hdl,
                          2000,300)!=NCSCC_RC_SUCCESS)
                          {      printf("Response Fail\n");FAIL=1;    }
@@ -5610,6 +5654,7 @@ void tet_vdest_rcvr_thread()
 void tet_Dadest_all_rcvr_thread()
 {
        MDS_SVC_ID svc_id;
+       bool rsp_reqd = false;
        char tmp[] = " Hi Sender! My Name is RECEIVER ";
        TET_MDS_MSG *mesg;
        mesg = (TET_MDS_MSG *)malloc(sizeof(TET_MDS_MSG));
@@ -5629,8 +5674,10 @@ void tet_Dadest_all_rcvr_thread()
                }
 
                /*after that send a response to the sender, if it expects*/
-               if (gl_direct_rcvmsginfo.rsp_reqd) {
-                       printf("i am here\n");
+               pthread_rwlock_rdlock(&gl_lock);
+               rsp_reqd = gl_direct_rcvmsginfo.rsp_reqd;
+               pthread_rwlock_unlock(&gl_lock);
+               if (rsp_reqd) {
                        if (vdest_change_role(200, V_DEST_RL_STANDBY) !=
                            NCSCC_RC_SUCCESS) {
                                printf("\nFail\n");
@@ -5641,7 +5688,9 @@ void tet_Dadest_all_rcvr_thread()
                                MDS_SENDTYPE_RSP, 0) != NCSCC_RC_SUCCESS) {
                                printf("\nFail\n");
                        }
+                       pthread_rwlock_wrlock(&gl_lock);
                        gl_rcvdmsginfo.rsp_reqd = 0;
+                       pthread_rwlock_unlock(&gl_lock);
                }
        }
        fflush(stdout);
@@ -5652,7 +5701,7 @@ void tet_Dadest_all_rcvr_thread()
 void tet_Dadest_all_chgrole_rcvr_thread()
 {
        MDS_SVC_ID svc_id;
-
+       bool rsp_reqd = false;
        printf("\nInside CHG ROLE ADEST direct Receiver Thread\n");
        fflush(stdout);
        if ((svc_id = is_adest_sel_obj_found(1))) {
@@ -5665,7 +5714,10 @@ void tet_Dadest_all_chgrole_rcvr_thread()
                        printf("\nFail mds_service_retrieve\n");
                }
                /*after that send a response to the sender, if it expects*/
-               if (gl_direct_rcvmsginfo.rsp_reqd) {
+               pthread_rwlock_rdlock(&gl_lock);
+               rsp_reqd = gl_direct_rcvmsginfo.rsp_reqd;
+               pthread_rwlock_unlock(&gl_lock);
+               if (rsp_reqd) {
                        if (vdest_change_role(200, V_DEST_RL_STANDBY) !=
                            NCSCC_RC_SUCCESS) {
                                printf("\nFail\n");
@@ -5682,8 +5734,9 @@ void tet_Dadest_all_chgrole_rcvr_thread()
                            NCSCC_RC_SUCCESS) {
                                printf("\nFail\n");
                        }
-
+                       pthread_rwlock_wrlock(&gl_lock);
                        gl_rcvdmsginfo.rsp_reqd = 0;
+                       pthread_rwlock_unlock(&gl_lock);
                }
        }
        fflush(stdout);
@@ -5692,6 +5745,7 @@ void tet_Dadest_all_chgrole_rcvr_thread()
 void tet_adest_all_chgrole_rcvr_thread()
 {
        MDS_SVC_ID svc_id;
+       bool rsp_reqd = false;
        char tmp[] = " Hi Sender! My Name is RECEIVER ";
        TET_MDS_MSG *mesg;
        mesg = (TET_MDS_MSG *)malloc(sizeof(TET_MDS_MSG));
@@ -5712,7 +5766,10 @@ void tet_adest_all_chgrole_rcvr_thread()
                } else {
                        /*after that send a response to the sender, if it
                         * expects*/
-                       if (gl_rcvdmsginfo.rsp_reqd) {
+                       pthread_rwlock_rdlock(&gl_lock);
+                       rsp_reqd = gl_rcvdmsginfo.rsp_reqd;
+                       pthread_rwlock_unlock(&gl_lock);
+                       if (rsp_reqd) {
                                if (vdest_change_role(200, V_DEST_RL_STANDBY) !=
                                    NCSCC_RC_SUCCESS) {
                                        printf("\nFail\n");
@@ -5729,8 +5786,9 @@ void tet_adest_all_chgrole_rcvr_thread()
                                    NCSCC_RC_SUCCESS) {
                                        printf("\nFail\n");
                                }
-
+                               pthread_rwlock_wrlock(&gl_lock);
                                gl_rcvdmsginfo.rsp_reqd = 0;
+                               pthread_rwlock_unlock(&gl_lock);
                        }
                }
        }
@@ -5740,6 +5798,7 @@ void tet_adest_all_chgrole_rcvr_thread()
 void tet_vdest_all_rcvr_thread()
 {
        MDS_SVC_ID svc_id;
+       bool rsp_reqd = false;
        char tmp[] = " Hi Sender! My Name is RECEIVER ";
        TET_MDS_MSG *mesg;
        mesg = (TET_MDS_MSG *)malloc(sizeof(TET_MDS_MSG));
@@ -5764,13 +5823,18 @@ void tet_vdest_all_rcvr_thread()
                        printf("\nFail\n");
                }
                /*after that send a response to the sender, if it expects*/
-               if (gl_rcvdmsginfo.rsp_reqd) {
+               pthread_rwlock_rdlock(&gl_lock);
+               rsp_reqd = gl_rcvdmsginfo.rsp_reqd;
+               pthread_rwlock_unlock(&gl_lock);
+               if (rsp_reqd) {
                        if (mds_send_response(gl_tet_vdest[1].mds_pwe1_hdl,
                                              NCSMDS_SVC_ID_EXTERNAL_MIN,
                                              mesg) != NCSCC_RC_SUCCESS) {
                                printf("\nFail\n");
                        }
+                       pthread_rwlock_wrlock(&gl_lock);
                        gl_rcvdmsginfo.rsp_reqd = 0;
+                       pthread_rwlock_unlock(&gl_lock);
                }
        }
        fflush(stdout);
@@ -5779,6 +5843,7 @@ void tet_vdest_all_rcvr_thread()
 void tet_adest_all_rcvrack_thread()
 {
        MDS_SVC_ID svc_id;
+       bool rsp_reqd = false;
        uint32_t rs;
        char tmp[] = " Hi Sender! My Name is RECEIVER ";
        TET_MDS_MSG *mesg;
@@ -5798,7 +5863,10 @@ void tet_adest_all_rcvrack_thread()
                        printf("\nFailmds_service_retrieve \n");
                }
                /*after that send a response to the sender, if it expects*/
-               if (gl_rcvdmsginfo.rsp_reqd) {
+               pthread_rwlock_rdlock(&gl_lock);
+               rsp_reqd = gl_rcvdmsginfo.rsp_reqd;
+               pthread_rwlock_unlock(&gl_lock);
+               if (rsp_reqd) {
                        if (vdest_change_role(200, V_DEST_RL_STANDBY) !=
                            NCSCC_RC_SUCCESS) {
                                printf("\nFail\n");
@@ -5809,7 +5877,9 @@ void tet_adest_all_rcvrack_thread()
                                                mesg);
 
                        printf("\nResponse code is %d", rs);
+                       pthread_rwlock_wrlock(&gl_lock);
                        gl_rcvdmsginfo.rsp_reqd = 0;
+                       pthread_rwlock_unlock(&gl_lock);
                }
        }
        fflush(stdout);
@@ -5819,6 +5889,7 @@ void tet_adest_all_rcvrack_thread()
 void tet_adest_all_rcvrack_chgrole_thread()
 {
        MDS_SVC_ID svc_id;
+       bool rsp_reqd = false;
        uint32_t rs;
        char tmp[] = " Hi Sender! My Name is RECEIVER ";
        TET_MDS_MSG *mesg;
@@ -5838,7 +5909,10 @@ void tet_adest_all_rcvrack_chgrole_thread()
                        printf("\nFail mds_service_retrieve\n");
                }
                /*after that send a response to the sender, if it expects*/
-               if (gl_rcvdmsginfo.rsp_reqd) {
+               pthread_rwlock_rdlock(&gl_lock);
+               rsp_reqd = gl_rcvdmsginfo.rsp_reqd;
+               pthread_rwlock_unlock(&gl_lock);
+               if (rsp_reqd) {
                        if (vdest_change_role(200, V_DEST_RL_STANDBY) !=
                            NCSCC_RC_SUCCESS) {
                                printf("\nFail\n");
@@ -5860,7 +5934,9 @@ void tet_adest_all_rcvrack_chgrole_thread()
                        fflush(stdout);
 
                        printf("\nResponse code is %d", rs);
+                       pthread_rwlock_wrlock(&gl_lock);
                        gl_rcvdmsginfo.rsp_reqd = 0;
+                       pthread_rwlock_unlock(&gl_lock);
                }
        }
        fflush(stdout);
@@ -5870,6 +5946,7 @@ void tet_adest_all_rcvrack_chgrole_thread()
 void tet_Dadest_all_rcvrack_chgrole_thread()
 {
        MDS_SVC_ID svc_id;
+       bool rsp_reqd = false;
        uint32_t rs = 0;
 
        printf("\nInside Receiver Thread\n");
@@ -5883,7 +5960,10 @@ void tet_Dadest_all_rcvrack_chgrole_thread()
                        printf("\nFail mds_service_retrieve\n");
                }
                /*after that send a response to the sender, if it expects*/
-               if (gl_direct_rcvmsginfo.rsp_reqd) {
+               pthread_rwlock_rdlock(&gl_lock);
+               rsp_reqd = gl_direct_rcvmsginfo.rsp_reqd;
+               pthread_rwlock_unlock(&gl_lock);
+               if (rsp_reqd) {
                        if (vdest_change_role(200, V_DEST_RL_STANDBY) !=
                            NCSCC_RC_SUCCESS) {
                                printf("\nFail\n");
@@ -5911,7 +5991,9 @@ void tet_Dadest_all_rcvrack_chgrole_thread()
                        fflush(stdout);
 
                        printf("\nResponse code is %d", rs);
+                       pthread_rwlock_wrlock(&gl_lock);
                        gl_rcvdmsginfo.rsp_reqd = 0;
+                       pthread_rwlock_unlock(&gl_lock);
                }
        }
        fflush(stdout);
@@ -5932,6 +6014,7 @@ void tet_change_role_thread()
 void tet_adest_all_rcvr_thread()
 {
        MDS_SVC_ID svc_id;
+       bool rsp_reqd = false;
        char tmp[] = " Hi Sender! My Name is RECEIVER ";
        TET_MDS_MSG *mesg;
        mesg = (TET_MDS_MSG *)malloc(sizeof(TET_MDS_MSG));
@@ -5950,7 +6033,10 @@ void tet_adest_all_rcvr_thread()
                        printf("\nFail mds_service_retrieve\n");
                }
                /*after that send a response to the sender, if it expects*/
-               if (gl_rcvdmsginfo.rsp_reqd) {
+               pthread_rwlock_rdlock(&gl_lock);
+               rsp_reqd = gl_rcvdmsginfo.rsp_reqd;
+               pthread_rwlock_unlock(&gl_lock);
+               if (rsp_reqd) {
                        if (vdest_change_role(200, V_DEST_RL_STANDBY) !=
                            NCSCC_RC_SUCCESS) {
                                printf("\nFail\n");
@@ -5960,7 +6046,9 @@ void tet_adest_all_rcvr_thread()
                                              mesg) != NCSCC_RC_SUCCESS) {
                                printf("\nFail\n");
                        }
+                       pthread_rwlock_wrlock(&gl_lock);
                        gl_rcvdmsginfo.rsp_reqd = 0;
+                       pthread_rwlock_unlock(&gl_lock);
                }
        }
        fflush(stdout);
@@ -6985,9 +7073,11 @@ void tet_vdest_Srcvr_thread()
                        printf("\nFail mds_service_retrieve\n");
                }
                /*after that send a response to the sender, if it expects*/
+               pthread_rwlock_wrlock(&gl_lock);
                if (gl_rcvdmsginfo.rsp_reqd) {
                        gl_rcvdmsginfo.rsp_reqd = 0;
                }
+               pthread_rwlock_unlock(&gl_lock);
                /*      
if(mds_send_redrsp_getack(gl_tet_vdest[0].mds_pwe1_hdl,2000,
                        300)!=NCSCC_RC_SUCCESS)
                        {      printf("Response Ack Fail\n");FAIL=1;    }
@@ -10189,6 +10279,7 @@ void tet_direct_send_ack_tp_13()
 void tet_Dadest_rcvr_thread()
 {
        MDS_SVC_ID svc_id;
+       bool rsp_reqd = false;
        printf("\nInside Receiver Thread\n");
        fflush(stdout);
        if ((svc_id = is_adest_sel_obj_found(3))) {
@@ -10198,7 +10289,10 @@ void tet_Dadest_rcvr_thread()
                                         SA_DISPATCH_ALL) == NCSCC_RC_SUCCESS) {
                        /*after that send a response to the sender, if it
                         * expects*/
-                       if (gl_direct_rcvmsginfo.rsp_reqd) {
+                       pthread_rwlock_rdlock(&gl_lock);
+                       rsp_reqd = gl_direct_rcvmsginfo.rsp_reqd;
+                       pthread_rwlock_unlock(&gl_lock);
+                       if (rsp_reqd) {
                                if (mds_direct_response(
                                        gl_tet_adest.pwe[0].mds_pwe_hdl,
                                        NCSMDS_SVC_ID_EXTERNAL_MIN, 1,
@@ -10217,6 +10311,7 @@ void tet_Dadest_rcvr_thread()
 void tet_Dvdest_rcvr_thread()
 {
        MDS_SVC_ID svc_id;
+       bool rsp_reqd = false;
        printf("\nInside Receiver Thread\n");
        fflush(stdout);
        if ((svc_id = is_vdest_sel_obj_found(1, 1))) {
@@ -10226,7 +10321,10 @@ void tet_Dvdest_rcvr_thread()
                        printf("\nFail mds_service_retrieve\n");
                }
                /*after that send a response to the sender, if it expects*/
-               if (gl_direct_rcvmsginfo.rsp_reqd) {
+               pthread_rwlock_rdlock(&gl_lock);
+               rsp_reqd = gl_direct_rcvmsginfo.rsp_reqd;
+               pthread_rwlock_unlock(&gl_lock);
+               if (rsp_reqd) {
                        if (mds_direct_response(gl_tet_vdest[1].mds_pwe1_hdl,
                                                NCSMDS_SVC_ID_EXTERNAL_MIN, 1,
                                                MDS_SENDTYPE_SNDRACK,
@@ -10241,6 +10339,7 @@ void tet_Dvdest_rcvr_thread()
 void tet_Dvdest_rcvr_all_rack_thread()
 {
        MDS_SVC_ID svc_id;
+       bool rsp_reqd = false;
        printf("\nInside Receiver Thread\n");
        fflush(stdout);
        if ((svc_id = is_vdest_sel_obj_found(1, 1))) {
@@ -10250,7 +10349,10 @@ void tet_Dvdest_rcvr_all_rack_thread()
                        printf("Fail mds_service_retrieve\n");
                }
                /*after that send a response to the sender, if it expects*/
-               if (gl_direct_rcvmsginfo.rsp_reqd) {
+               pthread_rwlock_rdlock(&gl_lock);
+               rsp_reqd = gl_direct_rcvmsginfo.rsp_reqd;
+               pthread_rwlock_unlock(&gl_lock);
+               if (rsp_reqd) {
                        if (mds_direct_response(
                                gl_tet_vdest[1].mds_pwe1_hdl,
                                NCSMDS_SVC_ID_EXTERNAL_MIN, gl_set_msg_fmt_ver,
@@ -10266,6 +10368,7 @@ void tet_Dvdest_rcvr_all_rack_thread()
 void tet_Dvdest_rcvr_all_thread()
 {
        MDS_SVC_ID svc_id;
+       bool rsp_reqd = false;
        printf("\nInside Receiver Thread\n");
        fflush(stdout);
        if ((svc_id = is_vdest_sel_obj_found(1, 1))) {
@@ -10275,7 +10378,10 @@ void tet_Dvdest_rcvr_all_thread()
                        printf("Fail mds_service_retrieve\n");
                }
                /*after that send a response to the sender, if it expects*/
-               if (gl_direct_rcvmsginfo.rsp_reqd) {
+               pthread_rwlock_rdlock(&gl_lock);
+               rsp_reqd = gl_direct_rcvmsginfo.rsp_reqd;
+               pthread_rwlock_unlock(&gl_lock);
+               if (rsp_reqd) {
                        if (mds_direct_response(
                                gl_tet_vdest[1].mds_pwe1_hdl,
                                NCSMDS_SVC_ID_EXTERNAL_MIN, gl_set_msg_fmt_ver,
@@ -10290,6 +10396,7 @@ void tet_Dvdest_rcvr_all_thread()
 void tet_Dvdest_rcvr_all_chg_role_thread()
 {
        MDS_SVC_ID svc_id;
+       bool rsp_reqd = false;
        printf("\nInside Receiver Thread\n");
        fflush(stdout);
        sleep(10);
@@ -10304,7 +10411,10 @@ void tet_Dvdest_rcvr_all_chg_role_thread()
                        printf("Fail mds_service_retrieve\n");
                }
                /*after that send a response to the sender, if it expects*/
-               if (gl_direct_rcvmsginfo.rsp_reqd) {
+               pthread_rwlock_rdlock(&gl_lock);
+               rsp_reqd = gl_direct_rcvmsginfo.rsp_reqd;
+               pthread_rwlock_unlock(&gl_lock);
+               if (rsp_reqd) {
                        if (mds_direct_response(
                                gl_tet_vdest[1].mds_pwe1_hdl,
                                NCSMDS_SVC_ID_EXTERNAL_MIN, gl_set_msg_fmt_ver,
@@ -10320,6 +10430,7 @@ void tet_Dvdest_rcvr_all_chg_role_thread()
 void tet_Dvdest_Srcvr_thread()
 {
        MDS_SVC_ID svc_id;
+       bool rsp_reqd = false;
        printf("\nInside Receiver Thread\n");
        fflush(stdout);
        if ((svc_id = is_vdest_sel_obj_found(0, 0))) {
@@ -10329,7 +10440,10 @@ void tet_Dvdest_Srcvr_thread()
                        printf("Fail mds_service_retrieve\n");
                }
                /*after that send a response to the sender, if it expects*/
-               if (gl_direct_rcvmsginfo.rsp_reqd) {
+               pthread_rwlock_rdlock(&gl_lock);
+               rsp_reqd = gl_direct_rcvmsginfo.rsp_reqd;
+               pthread_rwlock_unlock(&gl_lock);
+               if (rsp_reqd) {
                        if (mds_direct_response(gl_tet_vdest[0].mds_pwe1_hdl,
                                                NCSMDS_SVC_ID_EXTERNAL_MIN, 1,
                                                MDS_SENDTYPE_RRSP,
@@ -10344,6 +10458,7 @@ void tet_Dvdest_Srcvr_thread()
 void tet_Dvdest_Srcvr_all_thread()
 {
        MDS_SVC_ID svc_id;
+       bool rsp_reqd = false;
        printf("\nInside Receiver Thread\n");
        fflush(stdout);
        if ((svc_id = is_vdest_sel_obj_found(0, 0))) {
@@ -10353,7 +10468,10 @@ void tet_Dvdest_Srcvr_all_thread()
                        printf("Fail mds_service_retrieve\n");
                }
                /*after that send a response to the sender, if it expects*/
-               if (gl_direct_rcvmsginfo.rsp_reqd) {
+               pthread_rwlock_rdlock(&gl_lock);
+               rsp_reqd = gl_direct_rcvmsginfo.rsp_reqd;
+               pthread_rwlock_unlock(&gl_lock);
+               if (rsp_reqd) {
                        if (mds_direct_response(
                                gl_tet_vdest[0].mds_pwe1_hdl,
                                NCSMDS_SVC_ID_EXTERNAL_MIN, gl_set_msg_fmt_ver,
@@ -10369,6 +10487,7 @@ void tet_Dvdest_Srcvr_all_thread()
 void tet_Dvdest_Arcvr_thread()
 {
        MDS_SVC_ID svc_id;
+       bool rsp_reqd = false;
        printf("\nInside Receiver Thread\n");
        fflush(stdout);
        if ((svc_id = is_vdest_sel_obj_found(0, 0))) {
@@ -10378,7 +10497,10 @@ void tet_Dvdest_Arcvr_thread()
                        printf("Fail mds_service_retrieve\n");
                }
                /*after that send a response to the sender, if it expects*/
-               if (gl_direct_rcvmsginfo.rsp_reqd) {
+               pthread_rwlock_rdlock(&gl_lock);
+               rsp_reqd = gl_direct_rcvmsginfo.rsp_reqd;
+               pthread_rwlock_unlock(&gl_lock);
+               if (rsp_reqd) {
                        if (mds_direct_response(gl_tet_vdest[0].mds_pwe1_hdl,
                                                NCSMDS_SVC_ID_EXTERNAL_MIN, 1,
                                                MDS_SENDTYPE_REDRACK,
@@ -10394,6 +10516,7 @@ void tet_Dvdest_Arcvr_thread()
 void tet_Dvdest_Arcvr_all_thread()
 {
        MDS_SVC_ID svc_id;
+       bool rsp_reqd = false;
        printf("\nInside Receiver Thread\n");
        fflush(stdout);
        if ((svc_id = is_vdest_sel_obj_found(0, 0))) {
@@ -10403,7 +10526,10 @@ void tet_Dvdest_Arcvr_all_thread()
                        printf("Fail mds_service_retrieve\n");
                }
                /*after that send a response to the sender, if it expects*/
-               if (gl_direct_rcvmsginfo.rsp_reqd) {
+               pthread_rwlock_rdlock(&gl_lock);
+               rsp_reqd = gl_direct_rcvmsginfo.rsp_reqd;
+               pthread_rwlock_unlock(&gl_lock);
+               if (rsp_reqd) {
                        if (mds_direct_response(
                                gl_tet_vdest[0].mds_pwe1_hdl,
                                NCSMDS_SVC_ID_EXTERNAL_MIN, gl_set_msg_fmt_ver,
diff --git a/src/mds/apitest/mdstipc_conf.c b/src/mds/apitest/mdstipc_conf.c
index 2b28c66..e54d8d5 100644
--- a/src/mds/apitest/mdstipc_conf.c
+++ b/src/mds/apitest/mdstipc_conf.c
@@ -23,15 +23,24 @@
 #include "base/osaf_poll.h"
 extern int fill_syncparameters(int);
 extern uint32_t mds_vdest_tbl_get_role(MDS_VDEST_ID vdest_id, V_DEST_RL *role);
+extern pthread_mutex_t gl_mds_library_mutex;
+
+extern pthread_mutex_t safe_printf_mutex;
+extern void safe_printf(const char* format, ... );
+extern int safe_fflush(FILE *stream);
+#define printf safe_printf
+#define fflush safe_fflush
+
 /****************** ADEST WRAPPERS ***********************/
 uint32_t adest_get_handle(void)
 {
-       memset(&ada_info, '\0', sizeof(ada_info));
-       memset(&gl_tet_adest, '\0', sizeof(gl_tet_adest));
+       NCSADA_INFO ada_info;
 
        ada_info.req = NCSADA_GET_HDLS;
 
        if (ncsada_api(&ada_info) == NCSCC_RC_SUCCESS) {
+               pthread_rwlock_wrlock(&gl_lock);
+               memset(&gl_tet_adest, '\0', sizeof(gl_tet_adest));
 
                gl_tet_adest.adest = ada_info.info.adest_get_hdls.o_adest;
                printf("\nADEST <%llx > : GET_HDLS is SUCCESSFUL",
@@ -41,6 +50,7 @@ uint32_t adest_get_handle(void)
                    ada_info.info.adest_get_hdls.o_mds_pwe1_hdl;
                gl_tet_adest.mds_adest_hdl =
                    ada_info.info.adest_get_hdls.o_mds_adest_hdl;
+               pthread_rwlock_unlock(&gl_lock);
                return NCSCC_RC_SUCCESS;
        } else {
                printf("\nRequest to ncsada_api: GET_HDLS has FAILED");
@@ -50,7 +60,7 @@ uint32_t adest_get_handle(void)
 
 uint32_t create_pwe_on_adest(MDS_HDL mds_adest_hdl, PW_ENV_ID pwe_id)
 {
-       memset(&ada_info, '\0', sizeof(ada_info));
+       NCSADA_INFO ada_info;
        ada_info.req = NCSADA_PWE_CREATE;
 
        ada_info.info.pwe_create.i_mds_adest_hdl = mds_adest_hdl;
@@ -59,10 +69,12 @@ uint32_t create_pwe_on_adest(MDS_HDL mds_adest_hdl, 
PW_ENV_ID pwe_id)
        if (ncsada_api(&ada_info) == NCSCC_RC_SUCCESS) {
 
                printf("\nPWE_CREATE is SUCCESSFUL : PWE = %d", pwe_id);
+               pthread_rwlock_wrlock(&gl_lock);
                gl_tet_adest.pwe[gl_tet_adest.pwe_count].pwe_id = pwe_id;
                gl_tet_adest.pwe[gl_tet_adest.pwe_count].mds_pwe_hdl =
                    ada_info.info.pwe_create.o_mds_pwe_hdl;
                gl_tet_adest.pwe_count++;
+               pthread_rwlock_unlock(&gl_lock);
                return NCSCC_RC_SUCCESS;
        } else {
                printf("\nRequest to PWE_CREATE on ADEST has FAILED\n");
@@ -72,14 +84,16 @@ uint32_t create_pwe_on_adest(MDS_HDL mds_adest_hdl, 
PW_ENV_ID pwe_id)
 
 uint32_t destroy_pwe_on_adest(MDS_HDL mds_pwe_hdl)
 {
-       memset(&ada_info, '\0', sizeof(ada_info));
+       NCSADA_INFO ada_info;
        ada_info.req = NCSADA_PWE_DESTROY;
 
        ada_info.info.pwe_destroy.i_mds_pwe_hdl = mds_pwe_hdl;
 
        if (ncsada_api(&ada_info) == NCSCC_RC_SUCCESS) {
                printf("\nADEST: PWE_DESTROY is SUCCESSFUL");
+               pthread_rwlock_wrlock(&gl_lock);
                gl_tet_adest.pwe_count--;
+               pthread_rwlock_unlock(&gl_lock);
                return NCSCC_RC_SUCCESS;
        } else {
                printf("\nRequest tO PWE_DESTROY on ADEST: has FAILED");
@@ -91,26 +105,28 @@ uint32_t destroy_pwe_on_adest(MDS_HDL mds_pwe_hdl)
 
 uint32_t create_vdest(NCS_VDEST_TYPE policy, MDS_DEST vdest)
 {
-       memset(&vda_info, '\0', sizeof(vda_info));
-       memset(&gl_tet_vdest[gl_vdest_indx], '\0', sizeof(TET_VDEST));
+       NCSVDA_INFO vda_info;
 
        vda_info.req = NCSVDA_VDEST_CREATE;
 
        vda_info.info.vdest_create.i_policy = policy;
        vda_info.info.vdest_create.i_create_type = NCSVDA_VDEST_CREATE_SPECIFIC;
-       vda_info.info.vdest_create.info.specified.i_vdest =
-           gl_tet_vdest[gl_vdest_indx].vdest = vdest;
+       vda_info.info.vdest_create.info.specified.i_vdest = vdest;
 
        if (ncsvda_api(&vda_info) == NCSCC_RC_SUCCESS) {
 
                printf("\n %lld : VDEST_CREATE is SUCCESSFUL",
                       (long long unsigned int)vdest);
                fflush(stdout);
+               pthread_rwlock_wrlock(&gl_lock);
+               memset(&gl_tet_vdest[gl_vdest_indx], '\0', sizeof(TET_VDEST));
+               gl_tet_vdest[gl_vdest_indx].vdest = vdest;
                gl_tet_vdest[gl_vdest_indx].mds_pwe1_hdl =
                    vda_info.info.vdest_create.o_mds_pwe1_hdl;
                gl_tet_vdest[gl_vdest_indx].mds_vdest_hdl =
                    vda_info.info.vdest_create.o_mds_vdest_hdl;
                gl_vdest_indx++;
+               pthread_rwlock_unlock(&gl_lock);
                return NCSCC_RC_SUCCESS;
        } else {
                printf("\nRequest to ncsvda_api: VDEST_CREATE has FAILED\n");
@@ -119,7 +135,7 @@ uint32_t create_vdest(NCS_VDEST_TYPE policy, MDS_DEST vdest)
 }
 uint32_t destroy_vdest(MDS_DEST vdest)
 {
-       memset(&vda_info, '\0', sizeof(vda_info)); /*zeroizing*/
+       NCSVDA_INFO vda_info;
        /*request*/
        vda_info.req = NCSVDA_VDEST_DESTROY;
 
@@ -131,8 +147,10 @@ uint32_t destroy_vdest(MDS_DEST vdest)
                printf("\n %lld : VDEST_DESTROY is SUCCESSFULL",
                       (long long unsigned int)vdest);
                fflush(stdout);
+               pthread_rwlock_wrlock(&gl_lock);
                memset(&gl_tet_vdest[gl_vdest_indx], '\0', sizeof(TET_VDEST));
                gl_vdest_indx--;
+               pthread_rwlock_unlock(&gl_lock);
                return NCSCC_RC_SUCCESS;
        } else {
                printf("\nRequest to ncsvda_api: VDEST_DESTROY has FAILED\n");
@@ -142,8 +160,7 @@ uint32_t destroy_vdest(MDS_DEST vdest)
 
 uint32_t create_named_vdest(bool persistent, NCS_VDEST_TYPE policy, char 
*vname)
 {
-       memset(&vda_info, '\0', sizeof(vda_info));
-       memset(&gl_tet_vdest[gl_vdest_indx], '\0', sizeof(TET_VDEST));
+       NCSVDA_INFO vda_info;
 
        vda_info.req = NCSVDA_VDEST_CREATE;
 
@@ -169,6 +186,8 @@ uint32_t create_named_vdest(bool persistent, NCS_VDEST_TYPE 
policy, char *vname)
        if (ncsvda_api(&vda_info) == NCSCC_RC_SUCCESS) {
 
                printf("\nNAMED VDEST_CREATE is SUCCESSFULL\n");
+               pthread_rwlock_wrlock(&gl_lock);
+               memset(&gl_tet_vdest[gl_vdest_indx], '\0', sizeof(TET_VDEST));
                gl_tet_vdest[gl_vdest_indx].vdest =
                    vda_info.info.vdest_create.info.named.o_vdest;
                gl_tet_vdest[gl_vdest_indx].mds_pwe1_hdl =
@@ -176,6 +195,7 @@ uint32_t create_named_vdest(bool persistent, NCS_VDEST_TYPE 
policy, char *vname)
                gl_tet_vdest[gl_vdest_indx].mds_vdest_hdl =
                    vda_info.info.vdest_create.o_mds_vdest_hdl;
                gl_vdest_indx++;
+               pthread_rwlock_unlock(&gl_lock);
                return NCSCC_RC_SUCCESS;
        } else {
                printf("\nNAMED VDEST_CREATE has FAILED\n");
@@ -185,7 +205,7 @@ uint32_t create_named_vdest(bool persistent, NCS_VDEST_TYPE 
policy, char *vname)
 uint32_t destroy_named_vdest(bool non_persistent, MDS_DEST vdest, char *vname)
 {
 
-       memset(&vda_info, '\0', sizeof(vda_info));
+       NCSVDA_INFO vda_info;
 
        vda_info.req = NCSVDA_VDEST_DESTROY;
 
@@ -201,8 +221,10 @@ uint32_t destroy_named_vdest(bool non_persistent, MDS_DEST 
vdest, char *vname)
        if (ncsvda_api(&vda_info) == NCSCC_RC_SUCCESS) {
                printf("\n %lld : VDEST_NAMED DESTROY is SUCCESSFULL\n",
                       (long long unsigned int)vdest);
+               pthread_rwlock_wrlock(&gl_lock);
                memset(&gl_tet_vdest[gl_vdest_indx], '\0', sizeof(TET_VDEST));
                gl_vdest_indx--;
+               pthread_rwlock_unlock(&gl_lock);
                return NCSCC_RC_SUCCESS;
        } else {
                printf(
@@ -213,7 +235,7 @@ uint32_t destroy_named_vdest(bool non_persistent, MDS_DEST 
vdest, char *vname)
 
 MDS_DEST vdest_lookup(char *vname)
 {
-       memset(&vda_info, '\0', sizeof(vda_info));
+       NCSVDA_INFO vda_info;
 
        vda_info.req = NCSVDA_VDEST_LOOKUP;
 
@@ -241,7 +263,7 @@ MDS_DEST vdest_lookup(char *vname)
 
 uint32_t vdest_change_role(MDS_DEST vdest, V_DEST_RL new_role)
 {
-       memset(&vda_info, '\0', sizeof(vda_info));
+       NCSVDA_INFO vda_info;
 
        vda_info.req = NCSVDA_VDEST_CHG_ROLE;
 
@@ -251,10 +273,14 @@ uint32_t vdest_change_role(MDS_DEST vdest, V_DEST_RL 
new_role)
        if (ncsvda_api(&vda_info) == NCSCC_RC_SUCCESS) {
                /*Making sure vdest change role done*/
                V_DEST_RL role = 0;
+               pthread_mutex_lock(&gl_mds_library_mutex);
                mds_vdest_tbl_get_role(vdest, &role);
+               pthread_mutex_unlock(&gl_mds_library_mutex);
                while (role != new_role) {
                        sleep(1);
+                       pthread_mutex_lock(&gl_mds_library_mutex);
                        mds_vdest_tbl_get_role(vdest, &role);
+                       pthread_mutex_unlock(&gl_mds_library_mutex);
                }
                printf("\nVDEST_CHANGE ROLE to %d is SUCCESSFULL", new_role);
                return NCSCC_RC_SUCCESS;
@@ -265,7 +291,7 @@ uint32_t vdest_change_role(MDS_DEST vdest, V_DEST_RL 
new_role)
 uint32_t create_pwe_on_vdest(MDS_HDL mds_vdest_hdl, PW_ENV_ID pwe_id)
 {
        int i;
-       memset(&vda_info, '\0', sizeof(vda_info));
+       NCSVDA_INFO vda_info;
 
        vda_info.req = NCSVDA_PWE_CREATE;
 
@@ -274,7 +300,7 @@ uint32_t create_pwe_on_vdest(MDS_HDL mds_vdest_hdl, 
PW_ENV_ID pwe_id)
 
        if (ncsvda_api(&vda_info) == NCSCC_RC_SUCCESS) {
                printf("\nVDEST_PWE CREATE PWE= %d is SUCCESSFULL", pwe_id);
-
+               pthread_rwlock_wrlock(&gl_lock);
                for (i = 0; i < gl_vdest_indx; i++) {
                        if (gl_tet_vdest[i].mds_vdest_hdl == mds_vdest_hdl) {
                                gl_tet_vdest[i]
@@ -287,6 +313,7 @@ uint32_t create_pwe_on_vdest(MDS_HDL mds_vdest_hdl, 
PW_ENV_ID pwe_id)
                                gl_tet_vdest[i].pwe_count++;
                        }
                }
+               pthread_rwlock_unlock(&gl_lock);
                return NCSCC_RC_SUCCESS;
        } else {
                printf("\nRequest to ncsvda_api: VDEST_PWE CREATE has FAILED");
@@ -297,13 +324,14 @@ uint32_t create_pwe_on_vdest(MDS_HDL mds_vdest_hdl, 
PW_ENV_ID pwe_id)
 uint32_t destroy_pwe_on_vdest(MDS_HDL mds_pwe_hdl)
 {
        int i, j;
-       memset(&vda_info, '\0', sizeof(vda_info));
+       NCSVDA_INFO vda_info;
 
        vda_info.req = NCSVDA_PWE_DESTROY;
 
        vda_info.info.pwe_destroy.i_mds_pwe_hdl = mds_pwe_hdl;
 
        if (ncsvda_api(&vda_info) == NCSCC_RC_SUCCESS) {
+               pthread_rwlock_wrlock(&gl_lock);
                for (i = 0; i < gl_vdest_indx; i++) {
                        for (j = gl_tet_vdest[i].pwe_count - 1; j >= 0; j--) {
                                if (gl_tet_vdest[i].pwe[j].mds_pwe_hdl ==
@@ -313,6 +341,7 @@ uint32_t destroy_pwe_on_vdest(MDS_HDL mds_pwe_hdl)
                                }
                        }
                }
+               pthread_rwlock_unlock(&gl_lock);
                return NCSCC_RC_SUCCESS;
        } else {
                printf("\nRequest to ncsvda_api: VDEST_PWE DESTROY has FAILED");
@@ -402,7 +431,7 @@ uint32_t mds_service_install(MDS_HDL mds_hdl, MDS_SVC_ID 
svc_id,
 
        if (ncsmds_api(&svc_to_mds_info) == NCSCC_RC_SUCCESS) {
                printf("\n %d : SERVICE INSTALL is SUCCESSFULL", svc_id);
-
+               pthread_rwlock_wrlock(&gl_lock);
                gl_tet_svc.dest = svc_to_mds_info.info.svc_install.o_dest;
                if (m_MDS_DEST_IS_AN_ADEST(gl_tet_svc.dest) == 0) {
                        gl_tet_svc.anc = svc_to_mds_info.info.svc_install.o_anc;
@@ -422,6 +451,7 @@ uint32_t mds_service_install(MDS_HDL mds_hdl, MDS_SVC_ID 
svc_id,
                                            gl_tet_svc;
                } else
                        gl_tet_adest.svc[gl_tet_adest.svc_count++] = gl_tet_svc;
+               pthread_rwlock_unlock(&gl_lock);
                return NCSCC_RC_SUCCESS;
        } else {
                printf("\nRequest to ncsmds_api: MDS INSTALL has FAILED\n");
@@ -444,7 +474,7 @@ uint32_t mds_service_uninstall(MDS_HDL mds_hdl, MDS_SVC_ID 
svc_id)
 
        if (ncsmds_api(&svc_to_mds_info) == NCSCC_RC_SUCCESS) {
                printf("\n %d : SERVICE UNINSTALL is SUCCESSFULL", svc_id);
-
+               pthread_rwlock_wrlock(&gl_lock);
                FOUND = 0;
                /*VDEST*/
                if (YES_ADEST == 0) {
@@ -501,6 +531,7 @@ uint32_t mds_service_uninstall(MDS_HDL mds_hdl, MDS_SVC_ID 
svc_id)
                                }
                        }
                }
+               pthread_rwlock_unlock(&gl_lock);
                return NCSCC_RC_SUCCESS;
        } else {
                printf("\nRequest to ncsmds_api: MDS UNINSTALL has FAILED\n");
@@ -540,7 +571,7 @@ uint32_t mds_service_subscribe(MDS_HDL mds_hdl, MDS_SVC_ID 
svc_id,
 
        if (ncsmds_api(&svc_to_mds_info) == NCSCC_RC_SUCCESS) {
                printf("\n MDS SERVICE SUBSCRIBE is SUCCESSFULL");
-
+               pthread_rwlock_wrlock(&gl_lock);
                FOUND = 0;
                /*VDEST*/
                if (YES_ADEST == 0) {
@@ -698,6 +729,7 @@ uint32_t mds_service_subscribe(MDS_HDL mds_hdl, MDS_SVC_ID 
svc_id,
                                }
                        }
                }
+               pthread_rwlock_unlock(&gl_lock);
                return NCSCC_RC_SUCCESS;
        } else {
                printf("\nRequest to ncsmds_api: MDS SUBSCRIBE has FAILED\n");
@@ -725,7 +757,7 @@ uint32_t mds_service_redundant_subscribe(MDS_HDL mds_hdl, 
MDS_SVC_ID svc_id,
 
        if (ncsmds_api(&svc_to_mds_info) == NCSCC_RC_SUCCESS) {
                printf("\n MDS RED SUBSCRIBE is SUCCESSFULL");
-
+               pthread_rwlock_wrlock(&gl_lock);
                FOUND = 0;
                /*VDEST*/
                if (YES_ADEST == 0) {
@@ -883,7 +915,7 @@ uint32_t mds_service_redundant_subscribe(MDS_HDL mds_hdl, 
MDS_SVC_ID svc_id,
                                }
                        }
                }
-
+               pthread_rwlock_unlock(&gl_lock);
                return NCSCC_RC_SUCCESS;
        } else {
                printf(
@@ -906,7 +938,7 @@ uint32_t mds_service_cancel_subscription(MDS_HDL mds_hdl, 
MDS_SVC_ID svc_id,
 
        if (ncsmds_api(&svc_to_mds_info) == NCSCC_RC_SUCCESS) {
                printf("\n MDS CANCEL SUBSCRIBE is SUCCESSFULL");
-
+               pthread_rwlock_wrlock(&gl_lock);
                FOUND = 0;
                for (i = 0; i < gl_vdest_indx; i++) {
                        for (j = 0; j < gl_tet_vdest[i].svc_count; j++) {
@@ -947,6 +979,7 @@ uint32_t mds_service_cancel_subscription(MDS_HDL mds_hdl, 
MDS_SVC_ID svc_id,
                                        break;
                                }
                }
+               pthread_rwlock_unlock(&gl_lock);
                return NCSCC_RC_SUCCESS;
        } else {
                printf(
@@ -1972,7 +2005,7 @@ uint32_t tet_mds_cb_rcv(NCSMDS_CALLBACK_INFO 
*mds_to_svc_info)
        /*Now Display what message did u receive*/
        printf("\nReceived Message len = %d \nThe message is=%s",
               msg->recvd_len, msg->recvd_data);
-
+       pthread_rwlock_wrlock(&gl_lock);
        /*Now storing the message context on a global structure*/
        gl_rcvdmsginfo.yr_svc_hdl =
            mds_to_svc_info->i_yr_svc_hdl; /*the decider*/
@@ -1993,7 +2026,7 @@ uint32_t tet_mds_cb_rcv(NCSMDS_CALLBACK_INFO 
*mds_to_svc_info)
        gl_rcvdmsginfo.to_dest =
            mds_to_svc_info->info.receive.i_to_dest; /*FIX THIS*/
        gl_rcvdmsginfo.node_id = mds_to_svc_info->info.receive.i_node_id;
-
+       pthread_rwlock_unlock(&gl_lock);
        return NCSCC_RC_SUCCESS;
 }
 uint32_t tet_mds_cb_direct_rcv(NCSMDS_CALLBACK_INFO *mds_to_svc_info)
@@ -2029,6 +2062,7 @@ uint32_t tet_mds_cb_direct_rcv(NCSMDS_CALLBACK_INFO 
*mds_to_svc_info)
               mds_to_svc_info->info.direct_receive.i_direct_buff);
        fflush(stdout);
        /*Now storing the message context on a global structure*/
+       pthread_rwlock_wrlock(&gl_lock);
        gl_direct_rcvmsginfo.yr_svc_hdl =
            mds_to_svc_info->i_yr_svc_hdl; /*the decider*/
 
@@ -2056,6 +2090,7 @@ uint32_t tet_mds_cb_direct_rcv(NCSMDS_CALLBACK_INFO 
*mds_to_svc_info)
                gl_direct_rcvmsginfo.msg_ctxt =
                    mds_to_svc_info->info.direct_receive.i_msg_ctxt;
        }
+       pthread_rwlock_unlock(&gl_lock);
        mds_free_direct_buff(
            mds_to_svc_info->info.direct_receive.i_direct_buff);
        return NCSCC_RC_SUCCESS;
@@ -2064,6 +2099,8 @@ uint32_t tet_mds_cb_direct_rcv(NCSMDS_CALLBACK_INFO 
*mds_to_svc_info)
 uint32_t tet_mds_svc_event(NCSMDS_CALLBACK_INFO *mds_to_svc_info)
 {
        int i, j, k;
+       TET_EVENT_INFO gl_event_data;
+
        gl_event_data.ur_svc_id = mds_to_svc_info->info.svc_evt.i_your_id;
 
        gl_event_data.event = mds_to_svc_info->info.svc_evt.i_change;
@@ -2076,6 +2113,7 @@ uint32_t tet_mds_svc_event(NCSMDS_CALLBACK_INFO 
*mds_to_svc_info)
        gl_event_data.rem_svc_pvt_ver =
            mds_to_svc_info->info.svc_evt.i_rem_svc_pvt_ver;
        gl_event_data.svc_pwe_hdl = mds_to_svc_info->info.svc_evt.svc_pwe_hdl;
+       pthread_rwlock_wrlock(&gl_lock);
        if (is_service_on_adest(gl_event_data.svc_pwe_hdl,
                                gl_event_data.ur_svc_id) == NCSCC_RC_SUCCESS) {
                printf("\nThe Subscriber Service id = %d is on ADEST",
@@ -2120,6 +2158,7 @@ uint32_t tet_mds_svc_event(NCSMDS_CALLBACK_INFO 
*mds_to_svc_info)
                        }
                }
        }
+       pthread_rwlock_unlock(&gl_lock);
        /*fill in the event info of this service*/
        /* If this service is installed with MDS queue ownership model hen use
           MDS_RETREIVE */
-- 
2.7.4



------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot
_______________________________________________
Opensaf-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/opensaf-devel

------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot
_______________________________________________
Opensaf-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/opensaf-devel

Reply via email to