[devel] [PATCH 1/1] mds: improve thread safety in mdstest - part 2 [#2746]

2018-03-26 Thread Hoa Le
- 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]

2018-03-27 Thread Hoa Le
- 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]

2018-03-26 Thread Hans Nordebäck
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]

2018-03-27 Thread Hoa Le

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]

2018-03-27 Thread Hans Nordebäck

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,