[devel] [PATCH 1/1] mds: improve thread safety in mdstest - part 2 [#2746]
- Use __thread if _Thread_local is not supported in GCC version lower than 4.9 --- src/mds/apitest/mdstipc.h | 6 ++ src/mds/apitest/mdstipc_api.c | 2 +- src/mds/apitest/mdstipc_conf.c | 2 +- 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/mds/apitest/mdstipc.h b/src/mds/apitest/mdstipc.h index 01b58c4..f67890a 100644 --- a/src/mds/apitest/mdstipc.h +++ b/src/mds/apitest/mdstipc.h @@ -21,6 +21,12 @@ #include "base/ncssysf_tsk.h" #include "base/ncssysf_def.h" +#if !defined(_Thread_local) +#define MDS_THREAD_LOCAL __thread +#else +#define MDS_THREAD_LOCAL _Thread_local +#endif + typedef struct tet_task { NCS_OS_CB entry; void *arg; diff --git a/src/mds/apitest/mdstipc_api.c b/src/mds/apitest/mdstipc_api.c index 669c770..2ff8238 100644 --- a/src/mds/apitest/mdstipc_api.c +++ b/src/mds/apitest/mdstipc_api.c @@ -33,7 +33,7 @@ static MDS_CLIENT_MSG_FORMAT_VER gl_set_msg_fmt_ver; MDS_SVC_ID svc_ids[3] = {2006, 2007, 2008}; -_Thread_local NCSMDS_INFO svc_to_mds_info; +MDS_THREAD_LOCAL NCSMDS_INFO svc_to_mds_info; pthread_mutex_t safe_printf_mutex = PTHREAD_MUTEX_INITIALIZER; pthread_mutex_t gl_mutex = PTHREAD_MUTEX_INITIALIZER; diff --git a/src/mds/apitest/mdstipc_conf.c b/src/mds/apitest/mdstipc_conf.c index c2d7d01..d6ee48e 100644 --- a/src/mds/apitest/mdstipc_conf.c +++ b/src/mds/apitest/mdstipc_conf.c @@ -25,7 +25,7 @@ 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 _Thread_local NCSMDS_INFO svc_to_mds_info; +extern MDS_THREAD_LOCAL NCSMDS_INFO svc_to_mds_info; extern pthread_mutex_t safe_printf_mutex; extern pthread_mutex_t gl_mutex; -- 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 Opensaf-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/opensaf-devel
[devel] [PATCH 1/1] mds: improve thread safety in mdstest - part 2 [#2746]
- Remove thread-local declaration of svc_to_mds_info --- src/mds/apitest/mdstipc_api.c | 7 ++- src/mds/apitest/mdstipc_conf.c | 43 +- 2 files changed, 27 insertions(+), 23 deletions(-) diff --git a/src/mds/apitest/mdstipc_api.c b/src/mds/apitest/mdstipc_api.c index 669c770..5bfa7ef 100644 --- a/src/mds/apitest/mdstipc_api.c +++ b/src/mds/apitest/mdstipc_api.c @@ -33,7 +33,6 @@ static MDS_CLIENT_MSG_FORMAT_VER gl_set_msg_fmt_ver; MDS_SVC_ID svc_ids[3] = {2006, 2007, 2008}; -_Thread_local NCSMDS_INFO svc_to_mds_info; pthread_mutex_t safe_printf_mutex = PTHREAD_MUTEX_INITIALIZER; pthread_mutex_t gl_mutex = PTHREAD_MUTEX_INITIALIZER; @@ -3513,6 +3512,7 @@ void tet_just_send_tp_11() MDS_SVC_ID svcids[] = {NCSMDS_SVC_ID_EXTERNAL_MIN}; gl_vdest_indx = 0; + NCSMDS_INFO svc_to_mds_info; char tmp[] = " Hi Receiver "; TET_MDS_MSG *mesg; mesg = (TET_MDS_MSG *)malloc(sizeof(TET_MDS_MSG)); @@ -8020,6 +8020,7 @@ void tet_direct_just_send_tp_9() { int FAIL = 0; MDS_SVC_ID svcids[] = {NCSMDS_SVC_ID_EXTERNAL_MIN}; + NCSMDS_INFO svc_to_mds_info; char message[] = "Direct Message"; /*start up*/ @@ -8145,6 +8146,7 @@ void tet_direct_just_send_tp_11() { int FAIL = 0; MDS_SVC_ID svcids[] = {NCSMDS_SVC_ID_EXTERNAL_MIN}; + NCSMDS_INFO svc_to_mds_info; char message[] = "Direct Message"; /*start up*/ @@ -9998,6 +1,7 @@ void tet_direct_send_ack_tp_10() { int FAIL = 0; MDS_SVC_ID svcids[] = {NCSMDS_SVC_ID_EXTERNAL_MIN}; + NCSMDS_INFO svc_to_mds_info; char message[] = "Direct Message"; /*start up*/ if (tet_initialise_setup(false)) { @@ -10074,6 +10077,7 @@ void tet_direct_send_ack_tp_11() { int FAIL = 0; MDS_SVC_ID svcids[] = {NCSMDS_SVC_ID_EXTERNAL_MIN}; + NCSMDS_INFO svc_to_mds_info; char message[] = "Direct Message"; /*start up*/ if (tet_initialise_setup(false)) { @@ -11709,6 +11713,7 @@ void tet_direct_broadcast_to_svc_tp_8() { int FAIL = 0; MDS_SVC_ID svcids[] = {NCSMDS_SVC_ID_EXTERNAL_MIN}; + NCSMDS_INFO svc_to_mds_info; /*Start up*/ if (tet_initialise_setup(false)) { printf("\n Setup Initialisation has Failed \n"); diff --git a/src/mds/apitest/mdstipc_conf.c b/src/mds/apitest/mdstipc_conf.c index c2d7d01..bf4c1de 100644 --- a/src/mds/apitest/mdstipc_conf.c +++ b/src/mds/apitest/mdstipc_conf.c @@ -25,7 +25,6 @@ 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 _Thread_local NCSMDS_INFO svc_to_mds_info; extern pthread_mutex_t safe_printf_mutex; extern pthread_mutex_t gl_mutex; @@ -418,7 +417,7 @@ uint32_t mds_service_install(MDS_HDL mds_hdl, MDS_SVC_ID svc_id, bool mds_q_ownership, bool fail_no_active_sends) { int i; - memset(&svc_to_mds_info, 0, sizeof(svc_to_mds_info)); + NCSMDS_INFO svc_to_mds_info; svc_to_mds_info.i_mds_hdl = mds_hdl; svc_to_mds_info.i_svc_id = svc_id; @@ -465,7 +464,7 @@ uint32_t mds_service_uninstall(MDS_HDL mds_hdl, MDS_SVC_ID svc_id) { int i, j, k, FOUND; uint32_t YES_ADEST; - memset(&svc_to_mds_info, 0, sizeof(svc_to_mds_info)); + NCSMDS_INFO svc_to_mds_info; /*Find whether this Service is on Adest or Vdest*/ YES_ADEST = is_service_on_adest(mds_hdl, svc_id); @@ -560,7 +559,7 @@ uint32_t mds_service_subscribe(MDS_HDL mds_hdl, MDS_SVC_ID svc_id, { int i, j, k, l, FOUND; uint32_t YES_ADEST; - memset(&svc_to_mds_info, 0, sizeof(svc_to_mds_info)); + NCSMDS_INFO svc_to_mds_info; /*Find whether this Service is on Adest or Vdest*/ YES_ADEST = is_service_on_adest(mds_hdl, svc_id); @@ -746,7 +745,7 @@ uint32_t mds_service_redundant_subscribe(MDS_HDL mds_hdl, MDS_SVC_ID svc_id, { int i, j, k, l, FOUND; uint32_t YES_ADEST; - memset(&svc_to_mds_info, 0, sizeof(svc_to_mds_info)); + NCSMDS_INFO svc_to_mds_info; /*Find whether this Service is on Adest or Vdest*/ YES_ADEST = is_service_on_adest(mds_hdl, svc_id); @@ -931,7 +930,7 @@ uint32_t mds_service_cancel_subscription(MDS_HDL mds_hdl, MDS_SVC_ID svc_id, uint8_t num_svcs, MDS_SVC_ID *svc_ids) { int i, j, k, FOUND; - memset(&svc_to_mds_info, 0, sizeof(svc_to_mds_info)); + NCSMDS_INFO svc_to_mds_info; svc_to_mds_info.i_mds_hdl = mds_hdl; svc_to_mds_info.i_svc_id = svc_id; svc_to_mds_info.i_op = MDS_CANCEL; @@ -998,7 +997,7 @@ uint32_t mds_just_send(MDS_HDL mds_hdl, MDS_SVC_ID svc_id, MDS_SVC_ID to_svc, TET_MDS_MSG *message) { uint32_t rs; - memset(&svc_to_mds_info, 0, sizeof(svc
Re: [devel] [PATCH 1/1] mds: improve thread safety in mdstest - part 2 [#2746]
Hi Hoa, Do we need the svc_to_mds_info to be tls? I used it in the sample added to ticket to reduce number of helgrind warnings when I verified safe_printf and safe_fflush. It should have been removed in the sample, as it was not fully verified. /Thanks HansN -Original Message- From: Hoa Le [mailto:hoa...@dektech.com.au] Sent: den 27 mars 2018 03:47 To: Anders Widell ; Hans Nordebäck Cc: opensaf-devel@lists.sourceforge.net; Hoa Le Subject: [PATCH 1/1] mds: improve thread safety in mdstest - part 2 [#2746] - Use __thread if _Thread_local is not supported in GCC version lower than 4.9 --- src/mds/apitest/mdstipc.h | 6 ++ src/mds/apitest/mdstipc_api.c | 2 +- src/mds/apitest/mdstipc_conf.c | 2 +- 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/mds/apitest/mdstipc.h b/src/mds/apitest/mdstipc.h index 01b58c4..f67890a 100644 --- a/src/mds/apitest/mdstipc.h +++ b/src/mds/apitest/mdstipc.h @@ -21,6 +21,12 @@ #include "base/ncssysf_tsk.h" #include "base/ncssysf_def.h" +#if !defined(_Thread_local) +#define MDS_THREAD_LOCAL __thread +#else +#define MDS_THREAD_LOCAL _Thread_local +#endif + typedef struct tet_task { NCS_OS_CB entry; void *arg; diff --git a/src/mds/apitest/mdstipc_api.c b/src/mds/apitest/mdstipc_api.c index 669c770..2ff8238 100644 --- a/src/mds/apitest/mdstipc_api.c +++ b/src/mds/apitest/mdstipc_api.c @@ -33,7 +33,7 @@ static MDS_CLIENT_MSG_FORMAT_VER gl_set_msg_fmt_ver; MDS_SVC_ID svc_ids[3] = {2006, 2007, 2008}; -_Thread_local NCSMDS_INFO svc_to_mds_info; +MDS_THREAD_LOCAL NCSMDS_INFO svc_to_mds_info; pthread_mutex_t safe_printf_mutex = PTHREAD_MUTEX_INITIALIZER; pthread_mutex_t gl_mutex = PTHREAD_MUTEX_INITIALIZER; diff --git a/src/mds/apitest/mdstipc_conf.c b/src/mds/apitest/mdstipc_conf.c index c2d7d01..d6ee48e 100644 --- a/src/mds/apitest/mdstipc_conf.c +++ b/src/mds/apitest/mdstipc_conf.c @@ -25,7 +25,7 @@ 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 _Thread_local NCSMDS_INFO svc_to_mds_info; +extern MDS_THREAD_LOCAL NCSMDS_INFO svc_to_mds_info; extern pthread_mutex_t safe_printf_mutex; extern pthread_mutex_t gl_mutex; -- 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 Opensaf-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/opensaf-devel
Re: [devel] [PATCH 1/1] mds: improve thread safety in mdstest - part 2 [#2746]
Hi Hans, In version 2 of the patch, I have removed the thread-local declaration of svc_to_mds_info as your suggestion and use it as local variable for each MDS service request to avoid Data race issues. Please help review it again. Thank you. -- Best regards, Hoa Le On 03/27/2018 01:41 PM, Hans Nordebäck wrote: Hi Hoa, Do we need the svc_to_mds_info to be tls? I used it in the sample added to ticket to reduce number of helgrind warnings when I verified safe_printf and safe_fflush. It should have been removed in the sample, as it was not fully verified. /Thanks HansN -Original Message- From: Hoa Le [mailto:hoa...@dektech.com.au] Sent: den 27 mars 2018 03:47 To: Anders Widell ; Hans Nordebäck Cc: opensaf-devel@lists.sourceforge.net; Hoa Le Subject: [PATCH 1/1] mds: improve thread safety in mdstest - part 2 [#2746] - Use __thread if _Thread_local is not supported in GCC version lower than 4.9 --- src/mds/apitest/mdstipc.h | 6 ++ src/mds/apitest/mdstipc_api.c | 2 +- src/mds/apitest/mdstipc_conf.c | 2 +- 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/mds/apitest/mdstipc.h b/src/mds/apitest/mdstipc.h index 01b58c4..f67890a 100644 --- a/src/mds/apitest/mdstipc.h +++ b/src/mds/apitest/mdstipc.h @@ -21,6 +21,12 @@ #include "base/ncssysf_tsk.h" #include "base/ncssysf_def.h" +#if !defined(_Thread_local) +#define MDS_THREAD_LOCAL __thread +#else +#define MDS_THREAD_LOCAL _Thread_local +#endif + typedef struct tet_task { NCS_OS_CB entry; void *arg; diff --git a/src/mds/apitest/mdstipc_api.c b/src/mds/apitest/mdstipc_api.c index 669c770..2ff8238 100644 --- a/src/mds/apitest/mdstipc_api.c +++ b/src/mds/apitest/mdstipc_api.c @@ -33,7 +33,7 @@ static MDS_CLIENT_MSG_FORMAT_VER gl_set_msg_fmt_ver; MDS_SVC_ID svc_ids[3] = {2006, 2007, 2008}; -_Thread_local NCSMDS_INFO svc_to_mds_info; +MDS_THREAD_LOCAL NCSMDS_INFO svc_to_mds_info; pthread_mutex_t safe_printf_mutex = PTHREAD_MUTEX_INITIALIZER; pthread_mutex_t gl_mutex = PTHREAD_MUTEX_INITIALIZER; diff --git a/src/mds/apitest/mdstipc_conf.c b/src/mds/apitest/mdstipc_conf.c index c2d7d01..d6ee48e 100644 --- a/src/mds/apitest/mdstipc_conf.c +++ b/src/mds/apitest/mdstipc_conf.c @@ -25,7 +25,7 @@ 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 _Thread_local NCSMDS_INFO svc_to_mds_info; +extern MDS_THREAD_LOCAL NCSMDS_INFO svc_to_mds_info; extern pthread_mutex_t safe_printf_mutex; extern pthread_mutex_t gl_mutex; -- 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 Opensaf-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/opensaf-devel
Re: [devel] [PATCH 1/1] mds: improve thread safety in mdstest - part 2 [#2746]
ack, review only. /Thanks HansN On 03/27/2018 10:34 AM, Hoa Le wrote: - Remove thread-local declaration of svc_to_mds_info --- src/mds/apitest/mdstipc_api.c | 7 ++- src/mds/apitest/mdstipc_conf.c | 43 +- 2 files changed, 27 insertions(+), 23 deletions(-) diff --git a/src/mds/apitest/mdstipc_api.c b/src/mds/apitest/mdstipc_api.c index 669c770..5bfa7ef 100644 --- a/src/mds/apitest/mdstipc_api.c +++ b/src/mds/apitest/mdstipc_api.c @@ -33,7 +33,6 @@ static MDS_CLIENT_MSG_FORMAT_VER gl_set_msg_fmt_ver; MDS_SVC_ID svc_ids[3] = {2006, 2007, 2008}; -_Thread_local NCSMDS_INFO svc_to_mds_info; pthread_mutex_t safe_printf_mutex = PTHREAD_MUTEX_INITIALIZER; pthread_mutex_t gl_mutex = PTHREAD_MUTEX_INITIALIZER; @@ -3513,6 +3512,7 @@ void tet_just_send_tp_11() MDS_SVC_ID svcids[] = {NCSMDS_SVC_ID_EXTERNAL_MIN}; gl_vdest_indx = 0; + NCSMDS_INFO svc_to_mds_info; char tmp[] = " Hi Receiver "; TET_MDS_MSG *mesg; mesg = (TET_MDS_MSG *)malloc(sizeof(TET_MDS_MSG)); @@ -8020,6 +8020,7 @@ void tet_direct_just_send_tp_9() { int FAIL = 0; MDS_SVC_ID svcids[] = {NCSMDS_SVC_ID_EXTERNAL_MIN}; + NCSMDS_INFO svc_to_mds_info; char message[] = "Direct Message"; /*start up*/ @@ -8145,6 +8146,7 @@ void tet_direct_just_send_tp_11() { int FAIL = 0; MDS_SVC_ID svcids[] = {NCSMDS_SVC_ID_EXTERNAL_MIN}; + NCSMDS_INFO svc_to_mds_info; char message[] = "Direct Message"; /*start up*/ @@ -9998,6 +1,7 @@ void tet_direct_send_ack_tp_10() { int FAIL = 0; MDS_SVC_ID svcids[] = {NCSMDS_SVC_ID_EXTERNAL_MIN}; + NCSMDS_INFO svc_to_mds_info; char message[] = "Direct Message"; /*start up*/ if (tet_initialise_setup(false)) { @@ -10074,6 +10077,7 @@ void tet_direct_send_ack_tp_11() { int FAIL = 0; MDS_SVC_ID svcids[] = {NCSMDS_SVC_ID_EXTERNAL_MIN}; + NCSMDS_INFO svc_to_mds_info; char message[] = "Direct Message"; /*start up*/ if (tet_initialise_setup(false)) { @@ -11709,6 +11713,7 @@ void tet_direct_broadcast_to_svc_tp_8() { int FAIL = 0; MDS_SVC_ID svcids[] = {NCSMDS_SVC_ID_EXTERNAL_MIN}; + NCSMDS_INFO svc_to_mds_info; /*Start up*/ if (tet_initialise_setup(false)) { printf("\n Setup Initialisation has Failed \n"); diff --git a/src/mds/apitest/mdstipc_conf.c b/src/mds/apitest/mdstipc_conf.c index c2d7d01..bf4c1de 100644 --- a/src/mds/apitest/mdstipc_conf.c +++ b/src/mds/apitest/mdstipc_conf.c @@ -25,7 +25,6 @@ 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 _Thread_local NCSMDS_INFO svc_to_mds_info; extern pthread_mutex_t safe_printf_mutex; extern pthread_mutex_t gl_mutex; @@ -418,7 +417,7 @@ uint32_t mds_service_install(MDS_HDL mds_hdl, MDS_SVC_ID svc_id, bool mds_q_ownership, bool fail_no_active_sends) { int i; - memset(&svc_to_mds_info, 0, sizeof(svc_to_mds_info)); + NCSMDS_INFO svc_to_mds_info; svc_to_mds_info.i_mds_hdl = mds_hdl; svc_to_mds_info.i_svc_id = svc_id; @@ -465,7 +464,7 @@ uint32_t mds_service_uninstall(MDS_HDL mds_hdl, MDS_SVC_ID svc_id) { int i, j, k, FOUND; uint32_t YES_ADEST; - memset(&svc_to_mds_info, 0, sizeof(svc_to_mds_info)); + NCSMDS_INFO svc_to_mds_info; /*Find whether this Service is on Adest or Vdest*/ YES_ADEST = is_service_on_adest(mds_hdl, svc_id); @@ -560,7 +559,7 @@ uint32_t mds_service_subscribe(MDS_HDL mds_hdl, MDS_SVC_ID svc_id, { int i, j, k, l, FOUND; uint32_t YES_ADEST; - memset(&svc_to_mds_info, 0, sizeof(svc_to_mds_info)); + NCSMDS_INFO svc_to_mds_info; /*Find whether this Service is on Adest or Vdest*/ YES_ADEST = is_service_on_adest(mds_hdl, svc_id); @@ -746,7 +745,7 @@ uint32_t mds_service_redundant_subscribe(MDS_HDL mds_hdl, MDS_SVC_ID svc_id, { int i, j, k, l, FOUND; uint32_t YES_ADEST; - memset(&svc_to_mds_info, 0, sizeof(svc_to_mds_info)); + NCSMDS_INFO svc_to_mds_info; /*Find whether this Service is on Adest or Vdest*/ YES_ADEST = is_service_on_adest(mds_hdl, svc_id); @@ -931,7 +930,7 @@ uint32_t mds_service_cancel_subscription(MDS_HDL mds_hdl, MDS_SVC_ID svc_id, uint8_t num_svcs, MDS_SVC_ID *svc_ids) { int i, j, k, FOUND; - memset(&svc_to_mds_info, 0, sizeof(svc_to_mds_info)); + NCSMDS_INFO svc_to_mds_info; svc_to_mds_info.i_mds_hdl = mds_hdl; svc_to_mds_info.i_svc_id = svc_id; svc_to_mds_info.i_op = MDS_CANCEL; @@ -998,7 +997,7 @@ uint32_t mds_just_send(MDS_HDL mds_hdl, MDS_SVC_ID svc_id, MDS_SVC_ID to_svc,