public inbox for ltp@lists.linux.it
 help / color / mirror / Atom feed
* [LTP] [PATCH] lib/tst_res.c: synchronize access to tst_res functions
@ 2014-02-18 13:53 Alexey Kodanev
  2014-02-25 13:19 ` chrubis
  2014-03-24 17:11 ` chrubis
  0 siblings, 2 replies; 4+ messages in thread
From: Alexey Kodanev @ 2014-02-18 13:53 UTC (permalink / raw)
  To: ltp-list; +Cc: vasily.isaenko, Alexey Kodanev

The patch adds synchronization mechanism which is required (tst_res.c
uses global variables e.g. T_exitval, tst_count, T_out, ...) when tst_res
functions are used in multi-threaded tests.
Note: it will only work if test is linked with pthread library, also some
functions include each other that is why recursive mutex is used (can be
locked several times by the same thread).

Signed-off-by: Alexey Kodanev <alexey.kodanev@oracle.com>
---
 lib/tst_res.c |   28 +++++++++++++++++++++++++---
 1 files changed, 25 insertions(+), 3 deletions(-)

diff --git a/lib/tst_res.c b/lib/tst_res.c
index 2a3eff6..8faa5a9 100644
--- a/lib/tst_res.c
+++ b/lib/tst_res.c
@@ -93,6 +93,7 @@
 
 #define _GNU_SOURCE		/* for asprintf */
 
+#include <pthread.h>
 #include <assert.h>
 #include <errno.h>
 #include <stdio.h>
@@ -138,6 +139,8 @@ pid_t spawned_program_pid;
 	assert(strlen(buf) > 0);		\
 } while (0)
 
+static pthread_mutex_t tmutex = PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP;
+
 /*
  * Define local function prototypes.
  */
@@ -226,6 +229,8 @@ const char *strttype(int ttype)
  */
 void tst_res(int ttype, const char *fname, const char *arg_fmt, ...)
 {
+	pthread_mutex_lock(&tmutex);
+
 	char tmesg[USERMESG];
 	int ttype_result = TTYPE_RESULT(ttype);
 
@@ -286,6 +291,7 @@ void tst_res(int ttype, const char *fname, const char *arg_fmt, ...)
 		tst_count++;
 	}
 
+	pthread_mutex_unlock(&tmutex);
 }
 
 /*
@@ -351,6 +357,8 @@ static void tst_condense(int tnum, int ttype, const char *tmesg)
  */
 void tst_flush(void)
 {
+	pthread_mutex_lock(&tmutex);
+
 #if DEBUG
 	printf("IN tst_flush\n");
 	fflush(stdout);
@@ -365,6 +373,8 @@ void tst_flush(void)
 	}
 
 	fflush(T_out);
+
+	pthread_mutex_unlock(&tmutex);
 }
 
 /*
@@ -537,6 +547,8 @@ static void check_env(void)
  */
 void tst_exit(void)
 {
+	pthread_mutex_lock(&tmutex);
+
 #if DEBUG
 	printf("IN tst_exit\n");
 	fflush(stdout);
@@ -568,10 +580,13 @@ pid_t tst_vfork(void)
  */
 int tst_environ(void)
 {
+	pthread_mutex_lock(&tmutex);
+	int ret = 0;
 	if ((T_out = fdopen(dup(fileno(stdout)), "w")) == NULL)
-		return -1;
-	else
-		return 0;
+		ret = -1;
+
+	pthread_mutex_unlock(&tmutex);
+	return ret;
 }
 
 /*
@@ -586,6 +601,8 @@ static int tst_brk_entered = 0;
  */
 void tst_brk(int ttype, const char *fname, void (*func) (void), const char *arg_fmt, ...)
 {
+	pthread_mutex_lock(&tmutex);
+
 	char tmesg[USERMESG];
 	int ttype_result = TTYPE_RESULT(ttype);
 
@@ -633,6 +650,7 @@ void tst_brk(int ttype, const char *fname, void (*func) (void), const char *arg_
 	if (tst_brk_entered == 0)
 		tst_exit();
 
+	pthread_mutex_unlock(&tmutex);
 }
 
 /*
@@ -659,6 +677,8 @@ void tst_resm(int ttype, const char *arg_fmt, ...)
  */
 void tst_resm_hexd(int ttype, const void *buf, size_t size, const char *arg_fmt, ...)
 {
+	pthread_mutex_lock(&tmutex);
+
 	char tmesg[USERMESG];
 
 #if DEBUG
@@ -692,6 +712,8 @@ void tst_resm_hexd(int ttype, const void *buf, size_t size, const char *arg_fmt,
 			pmesg = tmesg;
 		}
 	}
+
+	pthread_mutex_unlock(&tmutex);
 }
 
 /*
-- 
1.7.1


------------------------------------------------------------------------------
Managing the Performance of Cloud-Based Applications
Take advantage of what the Cloud has to offer - Avoid Common Pitfalls.
Read the Whitepaper.
http://pubads.g.doubleclick.net/gampad/clk?id=121054471&iu=/4140/ostg.clktrk
_______________________________________________
Ltp-list mailing list
Ltp-list@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/ltp-list

^ permalink raw reply related	[flat|nested] 4+ messages in thread

* Re: [LTP] [PATCH] lib/tst_res.c: synchronize access to tst_res functions
  2014-02-18 13:53 [LTP] [PATCH] lib/tst_res.c: synchronize access to tst_res functions Alexey Kodanev
@ 2014-02-25 13:19 ` chrubis
  2014-03-11 15:11   ` chrubis
  2014-03-24 17:11 ` chrubis
  1 sibling, 1 reply; 4+ messages in thread
From: chrubis @ 2014-02-25 13:19 UTC (permalink / raw)
  To: Alexey Kodanev; +Cc: vasily.isaenko, ltp-list, Mike Frysinger

Hi!
> The patch adds synchronization mechanism which is required (tst_res.c
> uses global variables e.g. T_exitval, tst_count, T_out, ...) when tst_res
> functions are used in multi-threaded tests.
> Note: it will only work if test is linked with pthread library, also some
> functions include each other that is why recursive mutex is used (can be
> locked several times by the same thread).

This looks good to me.

Mike can you have a look, just to be extra sure.

-- 
Cyril Hrubis
chrubis@suse.cz

------------------------------------------------------------------------------
Flow-based real-time traffic analytics software. Cisco certified tool.
Monitor traffic, SLAs, QoS, Medianet, WAAS etc. with NetFlow Analyzer
Customize your own dashboards, set traffic alerts and generate reports.
Network behavioral analysis & security monitoring. All-in-one tool.
http://pubads.g.doubleclick.net/gampad/clk?id=126839071&iu=/4140/ostg.clktrk
_______________________________________________
Ltp-list mailing list
Ltp-list@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/ltp-list

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [LTP] [PATCH] lib/tst_res.c: synchronize access to tst_res functions
  2014-02-25 13:19 ` chrubis
@ 2014-03-11 15:11   ` chrubis
  0 siblings, 0 replies; 4+ messages in thread
From: chrubis @ 2014-03-11 15:11 UTC (permalink / raw)
  To: Mike Frysinger; +Cc: vasily.isaenko, ltp-list

Hi!
> > The patch adds synchronization mechanism which is required (tst_res.c
> > uses global variables e.g. T_exitval, tst_count, T_out, ...) when tst_res
> > functions are used in multi-threaded tests.
> > Note: it will only work if test is linked with pthread library, also some
> > functions include each other that is why recursive mutex is used (can be
> > locked several times by the same thread).
> 
> This looks good to me.
> 
> Mike can you have a look, just to be extra sure.
> 

Ping.

-- 
Cyril Hrubis
chrubis@suse.cz

------------------------------------------------------------------------------
Learn Graph Databases - Download FREE O'Reilly Book
"Graph Databases" is the definitive new guide to graph databases and their
applications. Written by three acclaimed leaders in the field,
this first edition is now available. Download your free book today!
http://p.sf.net/sfu/13534_NeoTech
_______________________________________________
Ltp-list mailing list
Ltp-list@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/ltp-list

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [LTP] [PATCH] lib/tst_res.c: synchronize access to tst_res functions
  2014-02-18 13:53 [LTP] [PATCH] lib/tst_res.c: synchronize access to tst_res functions Alexey Kodanev
  2014-02-25 13:19 ` chrubis
@ 2014-03-24 17:11 ` chrubis
  1 sibling, 0 replies; 4+ messages in thread
From: chrubis @ 2014-03-24 17:11 UTC (permalink / raw)
  To: Alexey Kodanev; +Cc: vasily.isaenko, ltp-list

Hi!
> The patch adds synchronization mechanism which is required (tst_res.c
> uses global variables e.g. T_exitval, tst_count, T_out, ...) when tst_res
> functions are used in multi-threaded tests.
> Note: it will only work if test is linked with pthread library, also some
> functions include each other that is why recursive mutex is used (can be
> locked several times by the same thread).

I've reworded the commit message a bit to make it (hopefully) more
clear and pushed the change. Thanks.

PS: Can you add a paragraph about thread safety and about the once
    callback macro to test-writing-guidelines or should I write it?

-- 
Cyril Hrubis
chrubis@suse.cz

------------------------------------------------------------------------------
Learn Graph Databases - Download FREE O'Reilly Book
"Graph Databases" is the definitive new guide to graph databases and their
applications. Written by three acclaimed leaders in the field,
this first edition is now available. Download your free book today!
http://p.sf.net/sfu/13534_NeoTech
_______________________________________________
Ltp-list mailing list
Ltp-list@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/ltp-list

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2014-03-24 17:11 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2014-02-18 13:53 [LTP] [PATCH] lib/tst_res.c: synchronize access to tst_res functions Alexey Kodanev
2014-02-25 13:19 ` chrubis
2014-03-11 15:11   ` chrubis
2014-03-24 17:11 ` chrubis

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox