diff options
author | Ben Cheng <bccheng@google.com> | 2014-03-25 22:37:19 -0700 |
---|---|---|
committer | Ben Cheng <bccheng@google.com> | 2014-03-25 22:37:19 -0700 |
commit | 1bc5aee63eb72b341f506ad058502cd0361f0d10 (patch) | |
tree | c607e8252f3405424ff15bc2d00aa38dadbb2518 /gcc-4.9/gcc/testsuite/c-c++-common/tsan | |
parent | 283a0bf58fcf333c58a2a92c3ebbc41fb9eb1fdb (diff) | |
download | toolchain_gcc-1bc5aee63eb72b341f506ad058502cd0361f0d10.tar.gz toolchain_gcc-1bc5aee63eb72b341f506ad058502cd0361f0d10.tar.bz2 toolchain_gcc-1bc5aee63eb72b341f506ad058502cd0361f0d10.zip |
Initial checkin of GCC 4.9.0 from trunk (r208799).
Change-Id: I48a3c08bb98542aa215912a75f03c0890e497dba
Diffstat (limited to 'gcc-4.9/gcc/testsuite/c-c++-common/tsan')
18 files changed, 572 insertions, 0 deletions
diff --git a/gcc-4.9/gcc/testsuite/c-c++-common/tsan/atomic_stack.c b/gcc-4.9/gcc/testsuite/c-c++-common/tsan/atomic_stack.c new file mode 100644 index 000000000..6a3795120 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/c-c++-common/tsan/atomic_stack.c @@ -0,0 +1,31 @@ +/* { dg-shouldfail "tsan" } */ + +#include <pthread.h> +#include <unistd.h> + +int Global; + +void *Thread1(void *x) { + sleep(1); + __atomic_fetch_add(&Global, 1, __ATOMIC_RELAXED); + return NULL; +} + +void *Thread2(void *x) { + Global++; + return NULL; +} + +int main() { + pthread_t t[2]; + 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; +} + +/* { dg-output "WARNING: ThreadSanitizer: data race.*(\n|\r\n|\r)" } */ +/* { dg-output " Atomic write of size 4.*" } */ +/* { dg-output " #0 __tsan_atomic32_fetch_add.*" } */ +/* { dg-output " #1 Thread1.*" } */ diff --git a/gcc-4.9/gcc/testsuite/c-c++-common/tsan/fd_pipe_race.c b/gcc-4.9/gcc/testsuite/c-c++-common/tsan/fd_pipe_race.c new file mode 100644 index 000000000..28cd630d2 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/c-c++-common/tsan/fd_pipe_race.c @@ -0,0 +1,36 @@ +/* { dg-shouldfail "tsan" } */ + +#include <pthread.h> +#include <stdio.h> +#include <unistd.h> + +int fds[2]; + +void *Thread1(void *x) { + write(fds[1], "a", 1); + return NULL; +} + +void *Thread2(void *x) { + sleep(1); + close(fds[0]); + close(fds[1]); + return NULL; +} + +int main() { + pipe(fds); + pthread_t t[2]; + pthread_create(&t[0], NULL, Thread1, NULL); + pthread_create(&t[1], NULL, Thread2, NULL); + pthread_join(t[0], NULL); + pthread_join(t[1], NULL); +} + +/* { dg-output "WARNING: ThreadSanitizer: data race.*\n" } */ +/* { dg-output " Write of size 8.*\n" } */ +/* { dg-output " #0 close.*\n" } */ +/* { dg-output " #1 Thread2.*\n" } */ +/* { dg-output " Previous read of size 8.*\n" } */ +/* { dg-output " #0 write.*\n" } */ +/* { dg-output " #1 Thread1.*\n" } */ diff --git a/gcc-4.9/gcc/testsuite/c-c++-common/tsan/free_race.c b/gcc-4.9/gcc/testsuite/c-c++-common/tsan/free_race.c new file mode 100644 index 000000000..258f7b742 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/c-c++-common/tsan/free_race.c @@ -0,0 +1,27 @@ +/* { dg-shouldfail "tsan" } */ + +#include <stdlib.h> + +void __attribute__((noinline)) foo(int *mem) { + free(mem); +} + +void __attribute__((noinline)) bar(int *mem) { + mem[0] = 42; +} + +int main() { + int *mem =(int*)malloc (100); + foo(mem); + bar(mem); + return 0; +} + +/* { dg-output "WARNING: ThreadSanitizer: heap-use-after-free.*(\n|\r\n|\r)" } */ +/* { dg-output " Write of size 4 at.* by main thread:(\n|\r\n|\r)" } */ +/* { dg-output " #0 bar.*(\n|\r\n|\r)" } */ +/* { dg-output " #1 main.*(\n|\r\n|\r)" } */ +/* { dg-output " Previous write of size 8 at.* by main thread:(\n|\r\n|\r)" } */ +/* { dg-output " #0 free.*(\n|\r\n|\r)" } */ +/* { dg-output " #\(1|2\) foo.*(\n|\r\n|\r)" } */ +/* { dg-output " #\(2|3\) main.*(\n|\r\n|\r)" } */ diff --git a/gcc-4.9/gcc/testsuite/c-c++-common/tsan/free_race2.c b/gcc-4.9/gcc/testsuite/c-c++-common/tsan/free_race2.c new file mode 100644 index 000000000..3971180c2 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/c-c++-common/tsan/free_race2.c @@ -0,0 +1,28 @@ +/* { dg-shouldfail "tsan" } */ + +#include <stdlib.h> + +void __attribute__((noinline)) foo(int *mem) { + free(mem); +} + +void __attribute__((noinline)) bar(int *mem) { + mem[0] = 42; +} + +int main() { + int *mem = (int*)malloc(100); + foo(mem); + bar(mem); + return 0; +} + +/* { dg-output "WARNING: ThreadSanitizer: heap-use-after-free.*(\n|\r\n|\r)" } */ +/* { dg-output " Write of size 4.* by main thread:(\n|\r\n|\r)" } */ +/* { dg-output " #0 bar.*" } */ +/* { dg-output " #1 main .*" } */ +/* { dg-output " Previous write of size 8 at .* by main thread:(\n|\r\n|\r)" } */ +/* { dg-output " #0 free .*" } */ +/* { dg-output " #\(1|2\) foo.*(\n|\r\n|\r)" } */ +/* { dg-output " #\(2|3\) main .*" } */ + diff --git a/gcc-4.9/gcc/testsuite/c-c++-common/tsan/mutexset1.c b/gcc-4.9/gcc/testsuite/c-c++-common/tsan/mutexset1.c new file mode 100644 index 000000000..7c32a8524 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/c-c++-common/tsan/mutexset1.c @@ -0,0 +1,40 @@ +/* { dg-shouldfail "tsan" } */ + +#include <pthread.h> +#include <stdio.h> +#include <unistd.h> + +int Global; +pthread_mutex_t mtx; + +void *Thread1(void *x) { + sleep(1); + pthread_mutex_lock(&mtx); + Global++; + pthread_mutex_unlock(&mtx); + return NULL; +} + +void *Thread2(void *x) { + Global--; + return NULL;/* { dg-output ".*" } */ + +} + +int main() { + pthread_mutex_init(&mtx, 0); + pthread_t t[2]; + 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); + return 0; +} + +/* { dg-output "WARNING: ThreadSanitizer: data race.*(\n|\r\n|\r)" } */ +/* { dg-output " Read of size 4 at 0x\[0-9a-f\]+ by thread T1 \\(mutexes: write M\[0-9\]\\):.*" } */ +/* { dg-output " Previous write of size 4 at 0x\[0-9a-f\]+ by thread T2:.*" } */ +/* { dg-output " Mutex M\[0-9\] created at:.*" } */ +/* { dg-output " #0 pthread_mutex_init.*" } */ +/* { dg-output " #1 main (.*mutexset1.c|\\?{2}):\[0-9]+.*" } */ diff --git a/gcc-4.9/gcc/testsuite/c-c++-common/tsan/race_on_barrier.c b/gcc-4.9/gcc/testsuite/c-c++-common/tsan/race_on_barrier.c new file mode 100644 index 000000000..0a0e5faba --- /dev/null +++ b/gcc-4.9/gcc/testsuite/c-c++-common/tsan/race_on_barrier.c @@ -0,0 +1,32 @@ +/* { dg-shouldfail "tsan" } */ + +#include <pthread.h> +#include <stdio.h> +#include <stddef.h> +#include <unistd.h> + +pthread_barrier_t B; +int Global; + +void *Thread1(void *x) { + pthread_barrier_init(&B, 0, 2); + pthread_barrier_wait(&B); + return NULL; +} + +void *Thread2(void *x) { + sleep(1); + pthread_barrier_wait(&B); + return NULL; +} + +int main() { + pthread_t t; + pthread_create(&t, NULL, Thread1, NULL); + Thread2(0); + pthread_join(t, NULL); + pthread_barrier_destroy(&B); + return 0; +} + +/* { dg-output "WARNING: ThreadSanitizer: data race.*(\n|\r\n|\r)" } */ diff --git a/gcc-4.9/gcc/testsuite/c-c++-common/tsan/race_on_barrier2.c b/gcc-4.9/gcc/testsuite/c-c++-common/tsan/race_on_barrier2.c new file mode 100644 index 000000000..b01a5cc21 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/c-c++-common/tsan/race_on_barrier2.c @@ -0,0 +1,32 @@ +/* { dg-shouldfail "tsan" } */ + +#include <pthread.h> +#include <stdio.h> +#include <stddef.h> +#include <unistd.h> + +pthread_barrier_t B; +int Global; + +void *Thread1(void *x) { + if (pthread_barrier_wait(&B) == PTHREAD_BARRIER_SERIAL_THREAD) + pthread_barrier_destroy(&B); + return NULL; +} + +void *Thread2(void *x) { + if (pthread_barrier_wait(&B) == PTHREAD_BARRIER_SERIAL_THREAD) + pthread_barrier_destroy(&B); + return NULL; +} + +int main() { + pthread_barrier_init(&B, 0, 2); + pthread_t t; + pthread_create(&t, NULL, Thread1, NULL); + Thread2(0); + pthread_join(t, NULL); + return 0; +} + +/* { dg-output "WARNING: ThreadSanitizer: data race.*(\n|\r\n|\r)" } */ diff --git a/gcc-4.9/gcc/testsuite/c-c++-common/tsan/race_on_mutex.c b/gcc-4.9/gcc/testsuite/c-c++-common/tsan/race_on_mutex.c new file mode 100644 index 000000000..5dad345d8 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/c-c++-common/tsan/race_on_mutex.c @@ -0,0 +1,43 @@ +/* { dg-shouldfail "tsan" } */ + +#include <pthread.h> +#include <stdio.h> +#include <stddef.h> +#include <unistd.h> + +pthread_mutex_t Mtx; +int Global; + +void *Thread1(void *x) { + pthread_mutex_init(&Mtx, 0); + pthread_mutex_lock(&Mtx); + Global = 42; + pthread_mutex_unlock(&Mtx); + return NULL; +} + +void *Thread2(void *x) { + sleep(1); + pthread_mutex_lock(&Mtx); + Global = 43; + pthread_mutex_unlock(&Mtx); + return NULL; +} + +int main() { + pthread_t t[2]; + 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); + return 0; +} + +/* { dg-output "WARNING: ThreadSanitizer: data race.*(\n|\r\n|\r)" } */ +/* { dg-output " Atomic read of size 1 at .* by thread T2:(\n|\r\n|\r)" } */ +/* { dg-output " #0 pthread_mutex_lock.*" } */ +/* { dg-output " #1 Thread2.* .*(race_on_mutex.c:21|\\?{2}:0) (.*)" } */ +/* { dg-output " Previous write of size 1 at .* by thread T1:(\n|\r\n|\r)" } */ +/* { dg-output " #0 pthread_mutex_init .* (.)*" } */ +/* { dg-output " #1 Thread1.* .*(race_on_mutex.c:12|\\?{2}:0) .*" } */ diff --git a/gcc-4.9/gcc/testsuite/c-c++-common/tsan/race_on_mutex2.c b/gcc-4.9/gcc/testsuite/c-c++-common/tsan/race_on_mutex2.c new file mode 100644 index 000000000..80a6fb6c0 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/c-c++-common/tsan/race_on_mutex2.c @@ -0,0 +1,25 @@ +/* { dg-shouldfail "tsan" } */ + +#include <pthread.h> +#include <stdio.h> +#include <stddef.h> +#include <unistd.h> + +void *Thread(void *x) { + pthread_mutex_lock((pthread_mutex_t*)x); + pthread_mutex_unlock((pthread_mutex_t*)x); + return 0; +} + +int main() { + pthread_mutex_t Mtx; + pthread_mutex_init(&Mtx, 0); + pthread_t t; + pthread_create(&t, 0, Thread, &Mtx); + sleep(1); + pthread_mutex_destroy(&Mtx); + pthread_join(t, 0); + return 0; +} + +/* { dg-output "WARNING: ThreadSanitizer: data race.*(\n|\r\n|\r)" } */ diff --git a/gcc-4.9/gcc/testsuite/c-c++-common/tsan/simple_race.c b/gcc-4.9/gcc/testsuite/c-c++-common/tsan/simple_race.c new file mode 100644 index 000000000..a40accd40 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/c-c++-common/tsan/simple_race.c @@ -0,0 +1,50 @@ +/* { dg-set-target-env-var TSAN_OPTIONS "halt_on_error=1" } */ +/* { dg-shouldfail "tsan" } */ + +#include <pthread.h> +#include <stdio.h> +#include <unistd.h> + +#define MAX_ITERATIONS_NUMBER 100 +#define SLEEP_STEP 128000 + +unsigned int delay_time = 1000; + +static inline void delay () { + usleep(delay_time); +} + +extern int main_1(); + +int main() { + int i; + for (i = 0; i < MAX_ITERATIONS_NUMBER; i++) { + main_1(); + delay_time += delay_time < 256000 ? delay_time : SLEEP_STEP; + } + return 0; +} + +int Global; + +void *Thread1(void *x) { + delay(); + Global = 42; + return NULL; +} + +void *Thread2(void *x) { + Global = 43; + return NULL; +} + +int main_1() { + pthread_t t[2]; + 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; +} + +/* { dg-output "WARNING: ThreadSanitizer: data race.*(\n|\r\n|\r)" } */ diff --git a/gcc-4.9/gcc/testsuite/c-c++-common/tsan/simple_stack.c b/gcc-4.9/gcc/testsuite/c-c++-common/tsan/simple_stack.c new file mode 100644 index 000000000..b66a67085 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/c-c++-common/tsan/simple_stack.c @@ -0,0 +1,65 @@ +/* { dg-shouldfail "tsan" } */ + +#include <pthread.h> +#include <stdio.h> +#include <unistd.h> + +int Global; + +void __attribute__((noinline)) foo1() { + Global = 42; +} + +void __attribute__((noinline)) bar1() { + volatile int tmp = 42; (void)tmp; + foo1(); +} + +void __attribute__((noinline)) foo2() { + volatile int v = Global; (void)v; +} + +void __attribute__((noinline)) bar2() { + volatile int tmp = 42; (void)tmp; + foo2(); +} + +void *Thread1(void *x) { + sleep(1); + bar1(); + return NULL; +} + +void *Thread2(void *x) { + bar2(); + return NULL; +} + +void StartThread(pthread_t *t, void *(*f)(void*)) { + pthread_create(t, NULL, f, NULL); +} + +int main() { + pthread_t t[2]; + StartThread(&t[0], Thread1); + StartThread(&t[1], Thread2); + pthread_join(t[0], NULL); + pthread_join(t[1], NULL); + return 0; +} + +/* { dg-output "WARNING: ThreadSanitizer: data race.*" } */ +/* { dg-output " Write of size 4 at .* by thread T1:(\n|\r\n|\r)" } */ +/* { dg-output " #0 foo1.* .*(simple_stack.c:10|\\?{2}:0) (.*)" } */ +/* { dg-output " #1 bar1.* .*(simple_stack.c:15|\\?{2}:0) (.*)" } */ +/* { dg-output " #2 Thread1.* .*(simple_stack.c:29|\\?{2}:0) (.*)" } */ +/* { dg-output " Previous read of size 4 at .* by thread T2:(\n|\r\n|\r)" } */ +/* { dg-output " #0 foo2.* .*(simple_stack.c:19|\\?{2}:0) (.*)" } */ +/* { dg-output " #1 bar2.* .*(simple_stack.c:24|\\?{2}:0) (.*)" } */ +/* { dg-output " #2 Thread2.* .*(simple_stack.c:34|\\?{2}:0) (.*)" } */ +/* { dg-output " Thread T1 \\(tid=.*, running\\) created by main thread at:(\n|\r\n|\r)" } */ +/* { dg-output " #0 pthread_create .* (.*)" } */ +/* { dg-output " #1 StartThread.* .*(simple_stack.c:39|\\?{2}:0) (.*)" } */ +/* { dg-output " Thread T2 (.*) created by main thread at:(\n|\r\n|\r)" } */ +/* { dg-output " #0 pthread_create .* (.*)" } */ +/* { dg-output " #1 StartThread.* .*(simple_stack.c:39|\\?{2}:0) (.*)" } */ diff --git a/gcc-4.9/gcc/testsuite/c-c++-common/tsan/sleep_sync.c b/gcc-4.9/gcc/testsuite/c-c++-common/tsan/sleep_sync.c new file mode 100644 index 000000000..44d44554c --- /dev/null +++ b/gcc-4.9/gcc/testsuite/c-c++-common/tsan/sleep_sync.c @@ -0,0 +1,30 @@ +/* { dg-shouldfail "tsan" } */ + +#include <pthread.h> +#include <unistd.h> + +int X = 0; + +void MySleep() { + sleep(1); +} + +void *Thread(void *p) { + MySleep(); // Assume the main thread has done the write. + X = 42; + return 0; +} + +int main() { + pthread_t t; + pthread_create(&t, 0, Thread, 0); + X = 43; + pthread_join(t, 0); + return 0; +} + +/* { dg-output "WARNING: ThreadSanitizer: data race.*(\n|\r\n|\r).*} */ +/* { dg-output " As if synchronized via sleep:(\n|\r\n|\r)} */ +/* { dg-output " #0 sleep.*"*} */ +/* { dg-output " #1 MySleep.*"*} */ +/* { dg-output " #2 Thread.*"*} */ diff --git a/gcc-4.9/gcc/testsuite/c-c++-common/tsan/thread_leak.c b/gcc-4.9/gcc/testsuite/c-c++-common/tsan/thread_leak.c new file mode 100644 index 000000000..02deaba58 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/c-c++-common/tsan/thread_leak.c @@ -0,0 +1,16 @@ +#include <pthread.h> +#include <stdio.h> + +void *Thread(void *x) { + return 0; +} + +int main() { + pthread_t t; + pthread_create(&t, 0, Thread, 0); + pthread_join(t, 0); + printf("PASS\n"); + return 0; +} + +/* { dg-prune-output "WARNING: ThreadSanitizer: thread leak.*" } */ diff --git a/gcc-4.9/gcc/testsuite/c-c++-common/tsan/thread_leak1.c b/gcc-4.9/gcc/testsuite/c-c++-common/tsan/thread_leak1.c new file mode 100644 index 000000000..ce28ee487 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/c-c++-common/tsan/thread_leak1.c @@ -0,0 +1,18 @@ +/* { dg-shouldfail "tsan" } */ + +#include <pthread.h> +#include <unistd.h> + +void *Thread(void *x) { + return 0; +} + +int main() { + pthread_t t; + pthread_create(&t, 0, Thread, 0); + sleep(1); + return 0; +} + +/* { dg-output "WARNING: ThreadSanitizer: thread leak.*(\n|\r\n|\r)" } */ +/* { dg-output "SUMMARY: ThreadSanitizer: thread leak.*main.*(\n|\r\n|\r)" } */ diff --git a/gcc-4.9/gcc/testsuite/c-c++-common/tsan/thread_leak2.c b/gcc-4.9/gcc/testsuite/c-c++-common/tsan/thread_leak2.c new file mode 100644 index 000000000..c9b804665 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/c-c++-common/tsan/thread_leak2.c @@ -0,0 +1,21 @@ +/* { dg-shouldfail "tsan" } */ + +#include <pthread.h> +#include <unistd.h> + +void *Thread(void *x) { + return 0; +} + +int main() { + int i; + for (i = 0; i < 5; i++) { + pthread_t t; + pthread_create(&t, 0, Thread, 0); + } + sleep(1); + return 0; +} + +/* { dg-output "WARNING: ThreadSanitizer: thread leak.*(\n|\r\n|\r)" } */ +/* { dg-output " And 4 more similar thread leaks.*" } */ diff --git a/gcc-4.9/gcc/testsuite/c-c++-common/tsan/tiny_race.c b/gcc-4.9/gcc/testsuite/c-c++-common/tsan/tiny_race.c new file mode 100644 index 000000000..962497b28 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/c-c++-common/tsan/tiny_race.c @@ -0,0 +1,22 @@ +/* { dg-shouldfail "tsan" } */ + +#include <pthread.h> +#include <unistd.h> + +int Global; + +void *Thread1(void *x) { + sleep(1); + Global = 42; + return x; +} + +int main() { + pthread_t t; + pthread_create(&t, 0, Thread1, 0); + Global = 43; + pthread_join(t, 0); + return Global; +} + +/* { dg-output "WARNING: ThreadSanitizer: data race.*(\n|\r\n|\r)" } */ diff --git a/gcc-4.9/gcc/testsuite/c-c++-common/tsan/tls_race.c b/gcc-4.9/gcc/testsuite/c-c++-common/tsan/tls_race.c new file mode 100644 index 000000000..423867e38 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/c-c++-common/tsan/tls_race.c @@ -0,0 +1,20 @@ +/* { dg-shouldfail "tsan" } */ + +#include <pthread.h> +#include <stddef.h> + +void *Thread(void *a) { + *(int*)a = 43; + return 0; +} + +int main() { + static __thread int Var = 42; + pthread_t t; + pthread_create(&t, 0, Thread, &Var); + Var = 43; + pthread_join(t, 0); +} + +/* { dg-output "WARNING: ThreadSanitizer: data race.*(\n|\r\n|\r).*" } */ +/* { dg-output " Location is TLS of main thread.(\n|\r\n|\r).*" } */ diff --git a/gcc-4.9/gcc/testsuite/c-c++-common/tsan/write_in_reader_lock.c b/gcc-4.9/gcc/testsuite/c-c++-common/tsan/write_in_reader_lock.c new file mode 100644 index 000000000..898d23d50 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/c-c++-common/tsan/write_in_reader_lock.c @@ -0,0 +1,36 @@ +/* { dg-shouldfail "tsan" } */ + +#include <pthread.h> +#include <unistd.h> + +pthread_rwlock_t rwlock; +int GLOB; + +void *Thread1(void *p) { + (void)p; + pthread_rwlock_rdlock(&rwlock); + // Write under reader lock. + sleep(1); + GLOB++; + pthread_rwlock_unlock(&rwlock); + return 0; +} + +int main(int argc, char *argv[]) { + pthread_rwlock_init(&rwlock, NULL); + pthread_rwlock_rdlock(&rwlock); + pthread_t t; + pthread_create(&t, 0, Thread1, 0); + volatile int x = GLOB; + (void)x; + pthread_rwlock_unlock(&rwlock); + pthread_join(t, 0); + pthread_rwlock_destroy(&rwlock); + return 0; +} + +/* { dg-output "WARNING: ThreadSanitizer: data race.*(\n|\r\n|\r)" } */ +/* { dg-output " Write of size 4 at 0x\[0-9a-f\]+ by thread T1.*:(\n|\r\n|\r).*" } */ +/* { dg-output " #0 Thread1.*\(write_in_reader_lock.c|\\?{2}\):\[0-9\]+ .*" } */ +/* { dg-output " Previous read of size 4 at.* by main thread.*:(\n|\r\n|\r).*" } */ +/* { dg-output " #0 main.*\(write_in_reader_lock.c|\\?{2}\):\[0-9\]+.*" } */ |