This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[RFC, PR68580] Handle pthread_create error in tsan testsuite


Hi,

Occasionally, I've been running into this failure while running the tsan testsuite:
...
FAIL: c-c++-common/tsan/pr65400-1.c -O0 execution test
...

I've also observed a potential similar occurrence here ( https://gcc.gnu.org/ml/gcc-regression/2015-08/msg00147.html ).

Initially, I couldn't reproduce it on the command line.

Then I tried mimicking heavy load situations that might arise while running the testsuite (I test with -j12 on a server), by running the test in parallel, and found that in that case pthread_create fails, and the test returns 0, which combined with the dg-shouldfail, makes the execution test fail.

So I suspect the failure I see while running the testsuite is the result of pthread_create failure.

The problem is that I can't be sure, given that in the testcase we do not distinguish between:
- return 0, case pthread_create failed, and
- return 0 at end of main, case -fsanitize=thread failed to catch the
  race condition.

Note also that it's possible that many other tsan tests are failing in pthread_create, but that this goes unnoticed because we don't test for the result of pthread_create in most tests.

This untested patch is an attempt at structurally testing and handling the result of pthread_create in the tsan testsuite, using this macro:
...
#define PTHREAD_CREATE(thread, attr, start_routine, arg)	\
  {								\
    int res = pthread_create (thread, attr, start_routine, arg);\
    if (res)							\
      {								\
	error (0, res, "pthread_create failed with");		\
	exit (0);						\
      }								\
  }
...

If this patch is committed, I should at least be able to find out if indeed the failure I observe is related to resource exhaustion.

Good idea? Any other comments?

Thanks,
- Tom

Handle pthread_create error in tsan testsuite

2016-02-15  Tom de Vries  <tom@codesourcery.com>

	PR testsuite/68580
	* c-c++-common/tsan/pthread_safe.h: New header file.
	* g++.dg/tsan/pthread_safe.h: Same.
	* c-c++-common/tsan/atomic_stack.c: Include pthread_safe.h.  Use
	PTHREAD_CREATE.
	* c-c++-common/tsan/bitfield_race.c: Same.
	* c-c++-common/tsan/fd_pipe_race.c: Same.
	* c-c++-common/tsan/mutexset1.c: Same.
	* c-c++-common/tsan/pr65400-1.c: Same.
	* c-c++-common/tsan/pr65400-3.c: Same.
	* c-c++-common/tsan/race_on_barrier.c: Same.
	* c-c++-common/tsan/race_on_barrier2.c: Same.
	* c-c++-common/tsan/race_on_mutex.c: Same.
	* c-c++-common/tsan/race_on_mutex2.c: Same.
	* c-c++-common/tsan/simple_race.c: Same.
	* c-c++-common/tsan/simple_stack.c: Same.
	* c-c++-common/tsan/sleep_sync.c: Same.
	* c-c++-common/tsan/thread_leak.c: Same.
	* c-c++-common/tsan/thread_leak1.c: Same.
	* c-c++-common/tsan/thread_leak2.c: Same.
	* c-c++-common/tsan/tiny_race.c: Same.
	* c-c++-common/tsan/tls_race.c: Same.
	* c-c++-common/tsan/write_in_reader_lock.c: Same.
	* g++.dg/tsan/aligned_vs_unaligned_race.C: Same.
	* g++.dg/tsan/atomic_free.C: Same.
	* g++.dg/tsan/atomic_free2.C: Same.
	* g++.dg/tsan/benign_race.C: Same.
	* g++.dg/tsan/cond_race.C: Same.
	* g++.dg/tsan/default_options.C: Same.
	* g++.dg/tsan/fd_close_norace.C: Same.
	* g++.dg/tsan/fd_close_norace2.C: Same.
	* g++.dg/tsan/pr64265.C: Same.
	* g++.dg/tsan/vptr_benign_race.C: Same.
	* g++.dg/tsan/vptr_harmful_race.C: Same.

---
 gcc/testsuite/c-c++-common/tsan/atomic_stack.c         |  5 +++--
 gcc/testsuite/c-c++-common/tsan/bitfield_race.c        |  3 ++-
 gcc/testsuite/c-c++-common/tsan/fd_pipe_race.c         |  5 +++--
 gcc/testsuite/c-c++-common/tsan/mutexset1.c            |  5 +++--
 gcc/testsuite/c-c++-common/tsan/pr65400-1.c            |  4 ++--
 gcc/testsuite/c-c++-common/tsan/pr65400-3.c            |  3 ++-
 gcc/testsuite/c-c++-common/tsan/pthread_safe.h         | 12 ++++++++++++
 gcc/testsuite/c-c++-common/tsan/race_on_barrier.c      |  3 ++-
 gcc/testsuite/c-c++-common/tsan/race_on_barrier2.c     |  3 ++-
 gcc/testsuite/c-c++-common/tsan/race_on_mutex.c        |  5 +++--
 gcc/testsuite/c-c++-common/tsan/race_on_mutex2.c       |  3 ++-
 gcc/testsuite/c-c++-common/tsan/simple_race.c          |  5 +++--
 gcc/testsuite/c-c++-common/tsan/simple_stack.c         |  3 ++-
 gcc/testsuite/c-c++-common/tsan/sleep_sync.c           |  3 ++-
 gcc/testsuite/c-c++-common/tsan/thread_leak.c          |  3 ++-
 gcc/testsuite/c-c++-common/tsan/thread_leak1.c         |  3 ++-
 gcc/testsuite/c-c++-common/tsan/thread_leak2.c         |  3 ++-
 gcc/testsuite/c-c++-common/tsan/tiny_race.c            |  3 ++-
 gcc/testsuite/c-c++-common/tsan/tls_race.c             |  3 ++-
 gcc/testsuite/c-c++-common/tsan/write_in_reader_lock.c |  3 ++-
 gcc/testsuite/g++.dg/tsan/aligned_vs_unaligned_race.C  |  5 +++--
 gcc/testsuite/g++.dg/tsan/atomic_free.C                |  3 ++-
 gcc/testsuite/g++.dg/tsan/atomic_free2.C               |  3 ++-
 gcc/testsuite/g++.dg/tsan/benign_race.C                |  3 ++-
 gcc/testsuite/g++.dg/tsan/cond_race.C                  |  3 ++-
 gcc/testsuite/g++.dg/tsan/default_options.C            |  5 +++--
 gcc/testsuite/g++.dg/tsan/fd_close_norace.C            |  5 +++--
 gcc/testsuite/g++.dg/tsan/fd_close_norace2.C           |  3 ++-
 gcc/testsuite/g++.dg/tsan/pr64265.C                    |  4 ++--
 gcc/testsuite/g++.dg/tsan/pthread_safe.h               | 12 ++++++++++++
 gcc/testsuite/g++.dg/tsan/vptr_benign_race.C           |  5 +++--
 gcc/testsuite/g++.dg/tsan/vptr_harmful_race.C          |  5 +++--
 32 files changed, 94 insertions(+), 42 deletions(-)

diff --git a/gcc/testsuite/c-c++-common/tsan/atomic_stack.c b/gcc/testsuite/c-c++-common/tsan/atomic_stack.c
index 746afa7..dee8f36 100644
--- a/gcc/testsuite/c-c++-common/tsan/atomic_stack.c
+++ b/gcc/testsuite/c-c++-common/tsan/atomic_stack.c
@@ -2,6 +2,7 @@
 /* { dg-additional-options "-ldl" } */
 
 #include <pthread.h>
+#include "pthread_safe.h"
 #include "tsan_barrier.h"
 
 static pthread_barrier_t barrier;
@@ -22,8 +23,8 @@ void *Thread2(void *x) {
 int main() {
   barrier_init(&barrier, 2);
   pthread_t t[2];
-  pthread_create(&t[0], NULL, Thread1, NULL);
-  pthread_create(&t[1], NULL, Thread2, NULL);
+  PTHREAD_CREATE(&t[0], NULL, Thread1, NULL);
+  PTHREAD_CREATE(&t[1], NULL, Thread2, NULL);
   pthread_join(t[0], NULL);
   pthread_join(t[1], NULL);
   return 0;
diff --git a/gcc/testsuite/c-c++-common/tsan/bitfield_race.c b/gcc/testsuite/c-c++-common/tsan/bitfield_race.c
index 4268115..ca4ce15 100644
--- a/gcc/testsuite/c-c++-common/tsan/bitfield_race.c
+++ b/gcc/testsuite/c-c++-common/tsan/bitfield_race.c
@@ -2,6 +2,7 @@
 /* { dg-additional-options "-ldl" } */
 
 #include <pthread.h>
+#include "pthread_safe.h"
 #include "tsan_barrier.h"
 
 static pthread_barrier_t barrier;
@@ -20,7 +21,7 @@ void *Thread1(void *x) {
 int main() {
   barrier_init(&barrier, 2);
   pthread_t t;
-  pthread_create(&t, 0, Thread1, 0);
+  PTHREAD_CREATE(&t, 0, Thread1, 0);
   Global.b = 43;
   barrier_wait(&barrier);
   pthread_join(t, 0);
diff --git a/gcc/testsuite/c-c++-common/tsan/fd_pipe_race.c b/gcc/testsuite/c-c++-common/tsan/fd_pipe_race.c
index e2176da..00c35c7 100644
--- a/gcc/testsuite/c-c++-common/tsan/fd_pipe_race.c
+++ b/gcc/testsuite/c-c++-common/tsan/fd_pipe_race.c
@@ -3,6 +3,7 @@
 
 #include <pthread.h>
 #include <unistd.h>
+#include "pthread_safe.h"
 #include "tsan_barrier.h"
 
 static pthread_barrier_t barrier;
@@ -25,8 +26,8 @@ int main() {
   barrier_init(&barrier, 2);
   pipe(fds);
   pthread_t t[2];
-  pthread_create(&t[0], NULL, Thread1, NULL);
-  pthread_create(&t[1], NULL, Thread2, NULL);
+  PTHREAD_CREATE(&t[0], NULL, Thread1, NULL);
+  PTHREAD_CREATE(&t[1], NULL, Thread2, NULL);
   pthread_join(t[0], NULL);
   pthread_join(t[1], NULL);
   return 0;
diff --git a/gcc/testsuite/c-c++-common/tsan/mutexset1.c b/gcc/testsuite/c-c++-common/tsan/mutexset1.c
index 3462ec4..e17222b 100644
--- a/gcc/testsuite/c-c++-common/tsan/mutexset1.c
+++ b/gcc/testsuite/c-c++-common/tsan/mutexset1.c
@@ -2,6 +2,7 @@
 /* { dg-additional-options "-ldl" } */
 
 #include <pthread.h>
+#include "pthread_safe.h"
 #include "tsan_barrier.h"
 
 static pthread_barrier_t barrier;
@@ -27,8 +28,8 @@ int main() {
   barrier_init(&barrier, 2);
   pthread_mutex_init(&mtx, 0);
   pthread_t t[2];
-  pthread_create(&t[0], NULL, Thread1, NULL);
-  pthread_create(&t[1], NULL, Thread2, NULL);
+  PTHREAD_CREATE(&t[0], NULL, Thread1, NULL);
+  PTHREAD_CREATE(&t[1], NULL, Thread2, NULL);
   pthread_join(t[0], NULL);
   pthread_join(t[1], NULL);
   pthread_mutex_destroy(&mtx);
diff --git a/gcc/testsuite/c-c++-common/tsan/pr65400-1.c b/gcc/testsuite/c-c++-common/tsan/pr65400-1.c
index 96fbbfd..df0f643 100644
--- a/gcc/testsuite/c-c++-common/tsan/pr65400-1.c
+++ b/gcc/testsuite/c-c++-common/tsan/pr65400-1.c
@@ -4,6 +4,7 @@
 /* { dg-additional-sources pr65400-2.c } */
 
 #include <pthread.h>
+#include "pthread_safe.h"
 #include "tsan_barrier.h"
 
 static pthread_barrier_t barrier;
@@ -74,8 +75,7 @@ main ()
 {
   pthread_t th;
   barrier_init (&barrier, 2);
-  if (pthread_create (&th, NULL, tf, NULL))
-    return 0;
+  PTHREAD_CREATE (&th, NULL, tf, NULL);
   v++;
   barrier_wait (&barrier);
   pthread_join (th, NULL);
diff --git a/gcc/testsuite/c-c++-common/tsan/pr65400-3.c b/gcc/testsuite/c-c++-common/tsan/pr65400-3.c
index 9483bb6..9e48ab3 100644
--- a/gcc/testsuite/c-c++-common/tsan/pr65400-3.c
+++ b/gcc/testsuite/c-c++-common/tsan/pr65400-3.c
@@ -3,6 +3,7 @@
 /* { dg-additional-options "-fno-omit-frame-pointer -ldl" } */
 
 #include <pthread.h>
+#include "pthread_safe.h"
 #include "tsan_barrier.h"
 
 static pthread_barrier_t barrier;
@@ -63,7 +64,7 @@ main ()
 {
   pthread_t th;
   barrier_init (&barrier, 2);
-  if (pthread_create (&th, NULL, tf, NULL))
+  if (PTHREAD_CREATE (&th, NULL, tf, NULL))
     return 0;
   barrier_wait (&barrier);
   v++;
diff --git a/gcc/testsuite/c-c++-common/tsan/pthread_safe.h b/gcc/testsuite/c-c++-common/tsan/pthread_safe.h
new file mode 100644
index 0000000..07d273a
--- /dev/null
+++ b/gcc/testsuite/c-c++-common/tsan/pthread_safe.h
@@ -0,0 +1,12 @@
+#include <error.h>
+#include <stdlib.h>
+
+#define PTHREAD_CREATE(thread, attr, start_routine, arg)		\
+  {									\
+    int res = pthread_create (thread, attr, start_routine, arg);	\
+    if (res)								\
+      {									\
+	error (0, res, "pthread_create failed with");			\
+	exit (0);							\
+      }									\
+  }
diff --git a/gcc/testsuite/c-c++-common/tsan/race_on_barrier.c b/gcc/testsuite/c-c++-common/tsan/race_on_barrier.c
index 3de3ff2..b96004d 100644
--- a/gcc/testsuite/c-c++-common/tsan/race_on_barrier.c
+++ b/gcc/testsuite/c-c++-common/tsan/race_on_barrier.c
@@ -2,6 +2,7 @@
 /* { dg-additional-options "-ldl" } */
 
 #include <pthread.h>
+#include "pthread_safe.h"
 #include "tsan_barrier.h"
 
 static pthread_barrier_t barrier;
@@ -24,7 +25,7 @@ void *Thread2(void *x) {
 int main() {
   barrier_init(&barrier, 2);
   pthread_t t;
-  pthread_create(&t, NULL, Thread1, NULL);
+  PTHREAD_CREATE(&t, NULL, Thread1, NULL);
   Thread2(0);
   pthread_join(t, NULL);
   pthread_barrier_destroy(&B);
diff --git a/gcc/testsuite/c-c++-common/tsan/race_on_barrier2.c b/gcc/testsuite/c-c++-common/tsan/race_on_barrier2.c
index b01a5cc..b15eacf 100644
--- a/gcc/testsuite/c-c++-common/tsan/race_on_barrier2.c
+++ b/gcc/testsuite/c-c++-common/tsan/race_on_barrier2.c
@@ -4,6 +4,7 @@
 #include <stdio.h>
 #include <stddef.h>
 #include <unistd.h>
+#include "pthread_safe.h"
 
 pthread_barrier_t B;
 int Global;
@@ -23,7 +24,7 @@ void *Thread2(void *x) {
 int main() {
   pthread_barrier_init(&B, 0, 2);
   pthread_t t;
-  pthread_create(&t, NULL, Thread1, NULL);
+  PTHREAD_CREATE(&t, NULL, Thread1, NULL);
   Thread2(0);
   pthread_join(t, NULL);
   return 0;
diff --git a/gcc/testsuite/c-c++-common/tsan/race_on_mutex.c b/gcc/testsuite/c-c++-common/tsan/race_on_mutex.c
index ae30d05..e2e1f00 100644
--- a/gcc/testsuite/c-c++-common/tsan/race_on_mutex.c
+++ b/gcc/testsuite/c-c++-common/tsan/race_on_mutex.c
@@ -2,6 +2,7 @@
 /* { dg-additional-options "-ldl" } */
 
 #include <pthread.h>
+#include "pthread_safe.h"
 #include "tsan_barrier.h"
 
 static pthread_barrier_t barrier;
@@ -28,8 +29,8 @@ void *Thread2(void *x) {
 int main() {
   barrier_init(&barrier, 2);
   pthread_t t[2];
-  pthread_create(&t[0], NULL, Thread1, NULL);
-  pthread_create(&t[1], NULL, Thread2, NULL);
+  PTHREAD_CREATE(&t[0], NULL, Thread1, NULL);
+  PTHREAD_CREATE(&t[1], NULL, Thread2, NULL);
   pthread_join(t[0], NULL);
   pthread_join(t[1], NULL);
   pthread_mutex_destroy(&Mtx);
diff --git a/gcc/testsuite/c-c++-common/tsan/race_on_mutex2.c b/gcc/testsuite/c-c++-common/tsan/race_on_mutex2.c
index 57d7e21..8bc508d 100644
--- a/gcc/testsuite/c-c++-common/tsan/race_on_mutex2.c
+++ b/gcc/testsuite/c-c++-common/tsan/race_on_mutex2.c
@@ -2,6 +2,7 @@
 /* { dg-additional-options "-ldl" } */
 
 #include <pthread.h>
+#include "pthread_safe.h"
 #include "tsan_barrier.h"
 
 static pthread_barrier_t barrier;
@@ -18,7 +19,7 @@ int main() {
   pthread_mutex_t Mtx;
   pthread_mutex_init(&Mtx, 0);
   pthread_t t;
-  pthread_create(&t, 0, Thread, &Mtx);
+  PTHREAD_CREATE(&t, 0, Thread, &Mtx);
   barrier_wait(&barrier);
   pthread_mutex_destroy(&Mtx);
   pthread_join(t, 0);
diff --git a/gcc/testsuite/c-c++-common/tsan/simple_race.c b/gcc/testsuite/c-c++-common/tsan/simple_race.c
index c1a369b..da614bb 100644
--- a/gcc/testsuite/c-c++-common/tsan/simple_race.c
+++ b/gcc/testsuite/c-c++-common/tsan/simple_race.c
@@ -4,6 +4,7 @@
 
 #include <pthread.h>
 #include <unistd.h>
+#include "pthread_safe.h"
 #include "tsan_barrier.h"
 
 #define MAX_ITERATIONS_NUMBER 1
@@ -45,8 +46,8 @@ void *Thread2(void *x) {
 
 int main_1() {
   pthread_t t[2];
-  pthread_create(&t[0], NULL, Thread1, NULL);
-  pthread_create(&t[1], NULL, Thread2, NULL);
+  PTHREAD_CREATE(&t[0], NULL, Thread1, NULL);
+  PTHREAD_CREATE(&t[1], NULL, Thread2, NULL);
   pthread_join(t[0], NULL);
   pthread_join(t[1], NULL);
   return 0;
diff --git a/gcc/testsuite/c-c++-common/tsan/simple_stack.c b/gcc/testsuite/c-c++-common/tsan/simple_stack.c
index a4d0aba..b20087d 100644
--- a/gcc/testsuite/c-c++-common/tsan/simple_stack.c
+++ b/gcc/testsuite/c-c++-common/tsan/simple_stack.c
@@ -2,6 +2,7 @@
 /* { dg-additional-options "-ldl" } */
 
 #include <pthread.h>
+#include "pthread_safe.h"
 #include "tsan_barrier.h"
 
 static pthread_barrier_t barrier;
@@ -38,7 +39,7 @@ void *Thread2(void *x) {
 }
 
 void StartThread(pthread_t *t, void *(*f)(void*)) {
-  pthread_create(t, NULL, f, NULL);
+  PTHREAD_CREATE(t, NULL, f, NULL);
 }
 
 int main() {
diff --git a/gcc/testsuite/c-c++-common/tsan/sleep_sync.c b/gcc/testsuite/c-c++-common/tsan/sleep_sync.c
index c681dce..7c0cada 100644
--- a/gcc/testsuite/c-c++-common/tsan/sleep_sync.c
+++ b/gcc/testsuite/c-c++-common/tsan/sleep_sync.c
@@ -3,6 +3,7 @@
 
 #include <pthread.h>
 #include <unistd.h>
+#include "pthread_safe.h"
 #include "tsan_barrier.h"
 
 static pthread_barrier_t barrier;
@@ -22,7 +23,7 @@ void *Thread(void *p) {
 int main() {
   barrier_init(&barrier, 2);
   pthread_t t;
-  pthread_create(&t, 0, Thread, 0);
+  PTHREAD_CREATE(&t, 0, Thread, 0);
   X = 43;
   barrier_wait(&barrier);
   pthread_join(t, 0);
diff --git a/gcc/testsuite/c-c++-common/tsan/thread_leak.c b/gcc/testsuite/c-c++-common/tsan/thread_leak.c
index 02deaba..644dd1d 100644
--- a/gcc/testsuite/c-c++-common/tsan/thread_leak.c
+++ b/gcc/testsuite/c-c++-common/tsan/thread_leak.c
@@ -1,5 +1,6 @@
 #include <pthread.h>
 #include <stdio.h>
+#include "pthread_safe.h"
 
 void *Thread(void *x) {
   return 0;
@@ -7,7 +8,7 @@ void *Thread(void *x) {
 
 int main() {
   pthread_t t;
-  pthread_create(&t, 0, Thread, 0);
+  PTHREAD_CREATE(&t, 0, Thread, 0);
   pthread_join(t, 0);
   printf("PASS\n");
   return 0;
diff --git a/gcc/testsuite/c-c++-common/tsan/thread_leak1.c b/gcc/testsuite/c-c++-common/tsan/thread_leak1.c
index ce28ee4..dde4abb 100644
--- a/gcc/testsuite/c-c++-common/tsan/thread_leak1.c
+++ b/gcc/testsuite/c-c++-common/tsan/thread_leak1.c
@@ -2,6 +2,7 @@
 
 #include <pthread.h>
 #include <unistd.h>
+#include "pthread_safe.h"
 
 void *Thread(void *x) {
   return 0;
@@ -9,7 +10,7 @@ void *Thread(void *x) {
 
 int main() {
   pthread_t t;
-  pthread_create(&t, 0, Thread, 0);
+  PTHREAD_CREATE(&t, 0, Thread, 0);
   sleep(1);
   return 0;
 }
diff --git a/gcc/testsuite/c-c++-common/tsan/thread_leak2.c b/gcc/testsuite/c-c++-common/tsan/thread_leak2.c
index c9b8046..24a871e 100644
--- a/gcc/testsuite/c-c++-common/tsan/thread_leak2.c
+++ b/gcc/testsuite/c-c++-common/tsan/thread_leak2.c
@@ -2,6 +2,7 @@
 
 #include <pthread.h>
 #include <unistd.h>
+#include "pthread_safe.h"
 
 void *Thread(void *x) {
   return 0;
@@ -11,7 +12,7 @@ int main() {
   int i;
   for (i = 0; i < 5; i++) {
     pthread_t t;
-    pthread_create(&t, 0, Thread, 0);
+    PTHREAD_CREATE(&t, 0, Thread, 0);
   }
   sleep(1);
   return 0;
diff --git a/gcc/testsuite/c-c++-common/tsan/tiny_race.c b/gcc/testsuite/c-c++-common/tsan/tiny_race.c
index 10a3feb..4c432f4 100644
--- a/gcc/testsuite/c-c++-common/tsan/tiny_race.c
+++ b/gcc/testsuite/c-c++-common/tsan/tiny_race.c
@@ -2,6 +2,7 @@
 /* { dg-additional-options "-ldl" } */
 
 #include <pthread.h>
+#include "pthread_safe.h"
 #include "tsan_barrier.h"
 
 static pthread_barrier_t barrier;
@@ -16,7 +17,7 @@ void *Thread1(void *x) {
 int main() {
   barrier_init(&barrier, 2);
   pthread_t t;
-  pthread_create(&t, 0, Thread1, 0);
+  PTHREAD_CREATE(&t, 0, Thread1, 0);
   Global = 43;
   barrier_wait(&barrier);
   pthread_join(t, 0);
diff --git a/gcc/testsuite/c-c++-common/tsan/tls_race.c b/gcc/testsuite/c-c++-common/tsan/tls_race.c
index 4dd6506..fd306f2 100644
--- a/gcc/testsuite/c-c++-common/tsan/tls_race.c
+++ b/gcc/testsuite/c-c++-common/tsan/tls_race.c
@@ -2,6 +2,7 @@
 /* { dg-additional-options "-ldl" } */
 
 #include <pthread.h>
+#include "pthread_safe.h"
 #include "tsan_barrier.h"
 
 static pthread_barrier_t barrier;
@@ -16,7 +17,7 @@ int main() {
   barrier_init(&barrier, 2);
   static __thread int Var = 42;
   pthread_t t;
-  pthread_create(&t, 0, Thread, &Var);
+  PTHREAD_CREATE(&t, 0, Thread, &Var);
   Var = 43;
   barrier_wait(&barrier);
   pthread_join(t, 0);
diff --git a/gcc/testsuite/c-c++-common/tsan/write_in_reader_lock.c b/gcc/testsuite/c-c++-common/tsan/write_in_reader_lock.c
index df32632..cff1761 100644
--- a/gcc/testsuite/c-c++-common/tsan/write_in_reader_lock.c
+++ b/gcc/testsuite/c-c++-common/tsan/write_in_reader_lock.c
@@ -2,6 +2,7 @@
 /* { dg-additional-options "-ldl" } */
 
 #include <pthread.h>
+#include "pthread_safe.h"
 #include "tsan_barrier.h"
 
 static pthread_barrier_t barrier;
@@ -23,7 +24,7 @@ int main(int argc, char *argv[]) {
   pthread_rwlock_init(&rwlock, NULL);
   pthread_rwlock_rdlock(&rwlock);
   pthread_t t;
-  pthread_create(&t, 0, Thread1, 0);
+  PTHREAD_CREATE(&t, 0, Thread1, 0);
   volatile int x = GLOB;
  (void)x;
   pthread_rwlock_unlock(&rwlock);
diff --git a/gcc/testsuite/g++.dg/tsan/aligned_vs_unaligned_race.C b/gcc/testsuite/g++.dg/tsan/aligned_vs_unaligned_race.C
index 1facadc..9d6fd63 100644
--- a/gcc/testsuite/g++.dg/tsan/aligned_vs_unaligned_race.C
+++ b/gcc/testsuite/g++.dg/tsan/aligned_vs_unaligned_race.C
@@ -4,6 +4,7 @@
 #include <pthread.h>
 #include <stdio.h>
 #include <stdint.h>
+#include "pthread_safe.h"
 #include "tsan_barrier.h"
 
 static pthread_barrier_t barrier;
@@ -27,8 +28,8 @@ void *Thread2(void *x) {
 int main() {
   barrier_init(&barrier, 2);
   pthread_t t[2];
-  pthread_create(&t[0], NULL, Thread1, NULL);
-  pthread_create(&t[1], NULL, Thread2, NULL);
+  PTHREAD_CREATE(&t[0], NULL, Thread1, NULL);
+  PTHREAD_CREATE(&t[1], NULL, Thread2, NULL);
   pthread_join(t[0], NULL);
   pthread_join(t[1], NULL);
   printf("Pass\n");
diff --git a/gcc/testsuite/g++.dg/tsan/atomic_free.C b/gcc/testsuite/g++.dg/tsan/atomic_free.C
index 20429f1..93c5c59 100644
--- a/gcc/testsuite/g++.dg/tsan/atomic_free.C
+++ b/gcc/testsuite/g++.dg/tsan/atomic_free.C
@@ -2,6 +2,7 @@
 /* { dg-additional-options "-ldl" } */
 
 #include <pthread.h>
+#include "pthread_safe.h"
 #include "tsan_barrier.h"
 
 static pthread_barrier_t barrier;
@@ -16,7 +17,7 @@ int main() {
   barrier_init(&barrier, 2);
   int *a = new int(0);
   pthread_t t;
-  pthread_create(&t, 0, Thread, a);
+  PTHREAD_CREATE(&t, 0, Thread, a);
   barrier_wait(&barrier);
   delete a;
   pthread_join(t, 0);
diff --git a/gcc/testsuite/g++.dg/tsan/atomic_free2.C b/gcc/testsuite/g++.dg/tsan/atomic_free2.C
index 3b6a8e3..b1f1fe7 100644
--- a/gcc/testsuite/g++.dg/tsan/atomic_free2.C
+++ b/gcc/testsuite/g++.dg/tsan/atomic_free2.C
@@ -2,6 +2,7 @@
 /* { dg-additional-options "-ldl" } */
 
 #include <pthread.h>
+#include "pthread_safe.h"
 #include "tsan_barrier.h"
 
 static pthread_barrier_t barrier;
@@ -16,7 +17,7 @@ int main() {
   barrier_init(&barrier, 2);
   int *a = new int(0);
   pthread_t t;
-  pthread_create(&t, 0, Thread, a);
+  PTHREAD_CREATE(&t, 0, Thread, a);
   delete a;
   barrier_wait(&barrier);
   pthread_join(t, 0);
diff --git a/gcc/testsuite/g++.dg/tsan/benign_race.C b/gcc/testsuite/g++.dg/tsan/benign_race.C
index b5f1720..295b41a 100644
--- a/gcc/testsuite/g++.dg/tsan/benign_race.C
+++ b/gcc/testsuite/g++.dg/tsan/benign_race.C
@@ -1,6 +1,7 @@
 #include <pthread.h>
 #include <stdio.h>
 #include <unistd.h>
+#include "pthread_safe.h"
 
 int Global;
 int WTFGlobal;
@@ -27,7 +28,7 @@ int main() {
                              &WTFGlobal, sizeof(WTFGlobal),
                              "Race on WTFGlobal");
   pthread_t t;
-  pthread_create(&t, 0, Thread, 0);
+  PTHREAD_CREATE(&t, 0, Thread, 0);
   sleep(1);
   Global = 43;
   WTFGlobal = 143;
diff --git a/gcc/testsuite/g++.dg/tsan/cond_race.C b/gcc/testsuite/g++.dg/tsan/cond_race.C
index d72d0fb..2fa9d27 100644
--- a/gcc/testsuite/g++.dg/tsan/cond_race.C
+++ b/gcc/testsuite/g++.dg/tsan/cond_race.C
@@ -4,6 +4,7 @@
 /* { dg-output "pthread_cond_signal.*" } */
 
 #include <pthread.h>
+#include "pthread_safe.h"
 #include "tsan_barrier.h"
 
 static pthread_barrier_t barrier;
@@ -30,7 +31,7 @@ int main() {
   pthread_mutex_init(&c->m, 0);
   pthread_cond_init(&c->c, 0);
   pthread_t th;
-  pthread_create(&th, 0, thr, c);
+  PTHREAD_CREATE(&th, 0, thr, c);
   pthread_mutex_lock(&c->m);
   while (!c->done)
     pthread_cond_wait(&c->c, &c->m);
diff --git a/gcc/testsuite/g++.dg/tsan/default_options.C b/gcc/testsuite/g++.dg/tsan/default_options.C
index 13e1984..35e113c 100644
--- a/gcc/testsuite/g++.dg/tsan/default_options.C
+++ b/gcc/testsuite/g++.dg/tsan/default_options.C
@@ -1,5 +1,6 @@
 #include <pthread.h>
 #include <stdio.h>
+#include "pthread_safe.h"
 
 extern "C" const char *__tsan_default_options() {
   return "report_bugs=0";
@@ -19,8 +20,8 @@ void *Thread2(void *x) {
 
 int main() {
   pthread_t t[2];
-  pthread_create(&t[0], NULL, Thread1, NULL);
-  pthread_create(&t[1], NULL, Thread2, NULL);
+  PTHREAD_CREATE(&t[0], NULL, Thread1, NULL);
+  PTHREAD_CREATE(&t[1], NULL, Thread2, NULL);
   pthread_join(t[0], NULL);
   pthread_join(t[1], NULL);
   fprintf(stderr, "DONE\n");
diff --git a/gcc/testsuite/g++.dg/tsan/fd_close_norace.C b/gcc/testsuite/g++.dg/tsan/fd_close_norace.C
index 9babb6a..08c4c0a 100644
--- a/gcc/testsuite/g++.dg/tsan/fd_close_norace.C
+++ b/gcc/testsuite/g++.dg/tsan/fd_close_norace.C
@@ -4,6 +4,7 @@
 #include <sys/types.h>
 #include <sys/stat.h>
 #include <fcntl.h>
+#include "pthread_safe.h"
 
 void *Thread1(void *x) {
   int f = open("/dev/random", O_RDONLY);
@@ -20,8 +21,8 @@ void *Thread2(void *x) {
 
 int main() {
   pthread_t t[2];
-  pthread_create(&t[0], NULL, Thread1, NULL);
-  pthread_create(&t[1], NULL, Thread2, NULL);
+  PTHREAD_CREATE(&t[0], NULL, Thread1, NULL);
+  PTHREAD_CREATE(&t[1], NULL, Thread2, NULL);
   pthread_join(t[0], NULL);
   pthread_join(t[1], NULL);
   printf("OK\n");
diff --git a/gcc/testsuite/g++.dg/tsan/fd_close_norace2.C b/gcc/testsuite/g++.dg/tsan/fd_close_norace2.C
index 56f00f8..103e6ec 100644
--- a/gcc/testsuite/g++.dg/tsan/fd_close_norace2.C
+++ b/gcc/testsuite/g++.dg/tsan/fd_close_norace2.C
@@ -1,6 +1,7 @@
 #include <pthread.h>
 #include <stdio.h>
 #include <unistd.h>
+#include "pthread_safe.h"
 
 int pipes[2];
 
@@ -17,7 +18,7 @@ int main() {
   if (pipe(pipes))
     return 1;
   pthread_t t;
-  pthread_create(&t, 0, Thread, 0);
+  PTHREAD_CREATE(&t, 0, Thread, 0);
   // send shutdown signal
   while (write(pipes[1], &t, 1) != 1) {
   }
diff --git a/gcc/testsuite/g++.dg/tsan/pr64265.C b/gcc/testsuite/g++.dg/tsan/pr64265.C
index fde32e7..9a08246 100644
--- a/gcc/testsuite/g++.dg/tsan/pr64265.C
+++ b/gcc/testsuite/g++.dg/tsan/pr64265.C
@@ -3,6 +3,7 @@
 // { dg-additional-options "-fno-omit-frame-pointer -ldl" }
 
 #include <pthread.h>
+#include "pthread_safe.h"
 #include "tsan_barrier.h"
 
 static pthread_barrier_t barrier;
@@ -43,8 +44,7 @@ main ()
 {
   pthread_t th;
   barrier_init (&barrier, 2);
-  if (pthread_create (&th, NULL, tf, NULL))
-    return 0;
+  PTHREAD_CREATE (&th, NULL, tf, NULL);
   v++;
   barrier_wait (&barrier);
   pthread_join (th, NULL);
diff --git a/gcc/testsuite/g++.dg/tsan/pthread_safe.h b/gcc/testsuite/g++.dg/tsan/pthread_safe.h
new file mode 100644
index 0000000..07d273a
--- /dev/null
+++ b/gcc/testsuite/g++.dg/tsan/pthread_safe.h
@@ -0,0 +1,12 @@
+#include <error.h>
+#include <stdlib.h>
+
+#define PTHREAD_CREATE(thread, attr, start_routine, arg)		\
+  {									\
+    int res = pthread_create (thread, attr, start_routine, arg);	\
+    if (res)								\
+      {									\
+	error (0, res, "pthread_create failed with");			\
+	exit (0);							\
+      }									\
+  }
diff --git a/gcc/testsuite/g++.dg/tsan/vptr_benign_race.C b/gcc/testsuite/g++.dg/tsan/vptr_benign_race.C
index 283684b..2cf0301 100644
--- a/gcc/testsuite/g++.dg/tsan/vptr_benign_race.C
+++ b/gcc/testsuite/g++.dg/tsan/vptr_benign_race.C
@@ -1,6 +1,7 @@
 #include <pthread.h>
 #include <semaphore.h>
 #include <stdio.h>
+#include "pthread_safe.h"
 
 struct A {
   A() {
@@ -40,8 +41,8 @@ void *Thread2(void *x) {
 
 int main() {
   pthread_t t[2];
-  pthread_create(&t[0], NULL, Thread1, NULL);
-  pthread_create(&t[1], NULL, Thread2, NULL);
+  PTHREAD_CREATE(&t[0], NULL, Thread1, NULL);
+  PTHREAD_CREATE(&t[1], NULL, Thread2, NULL);
   pthread_join(t[0], NULL);
   pthread_join(t[1], NULL);
   fprintf(stderr, "PASS\n");
diff --git a/gcc/testsuite/g++.dg/tsan/vptr_harmful_race.C b/gcc/testsuite/g++.dg/tsan/vptr_harmful_race.C
index 1473f93..c43b51f 100644
--- a/gcc/testsuite/g++.dg/tsan/vptr_harmful_race.C
+++ b/gcc/testsuite/g++.dg/tsan/vptr_harmful_race.C
@@ -5,6 +5,7 @@
 #include <semaphore.h>
 #include <stdio.h>
 #include <unistd.h>
+#include "pthread_safe.h"
 #include "tsan_barrier.h"
 
 static pthread_barrier_t barrier;
@@ -49,8 +50,8 @@ void *Thread2(void *x) {
 int main() {
   barrier_init(&barrier, 2);
   pthread_t t[2];
-  pthread_create(&t[0], NULL, Thread1, NULL);
-  pthread_create(&t[1], NULL, Thread2, NULL);
+  PTHREAD_CREATE(&t[0], NULL, Thread1, NULL);
+  PTHREAD_CREATE(&t[1], NULL, Thread2, NULL);
   pthread_join(t[0], NULL);
   pthread_join(t[1], NULL);
 }

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]