annotate compiler-rt/test/tsan/signal_cond.cpp @ 266:00f31e85ec16 default tip

Added tag current for changeset 31d058e83c98
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Sat, 14 Oct 2023 10:13:55 +0900
parents 1d019706d866
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
150
anatofuz
parents:
diff changeset
1 // RUN: %clang_tsan -O1 %s -o %t && %run %t 2>&1 | FileCheck %s
anatofuz
parents:
diff changeset
2 #include "test.h"
anatofuz
parents:
diff changeset
3 #include <signal.h>
anatofuz
parents:
diff changeset
4 #include <unistd.h>
anatofuz
parents:
diff changeset
5 #include <errno.h>
anatofuz
parents:
diff changeset
6 #include <semaphore.h>
anatofuz
parents:
diff changeset
7
anatofuz
parents:
diff changeset
8 // Test that signals can be delivered to blocked pthread_cond_wait.
anatofuz
parents:
diff changeset
9 // https://github.com/google/sanitizers/issues/498
anatofuz
parents:
diff changeset
10
anatofuz
parents:
diff changeset
11 int g_thread_run = 1;
anatofuz
parents:
diff changeset
12 pthread_mutex_t mutex;
anatofuz
parents:
diff changeset
13 pthread_cond_t cond;
anatofuz
parents:
diff changeset
14
anatofuz
parents:
diff changeset
15 void sig_handler(int sig) {
anatofuz
parents:
diff changeset
16 (void)sig;
anatofuz
parents:
diff changeset
17 write(2, "SIGNAL\n", sizeof("SIGNAL\n") - 1);
anatofuz
parents:
diff changeset
18 barrier_wait(&barrier);
anatofuz
parents:
diff changeset
19 }
anatofuz
parents:
diff changeset
20
anatofuz
parents:
diff changeset
21 void* my_thread(void* arg) {
anatofuz
parents:
diff changeset
22 pthread_mutex_lock(&mutex);
anatofuz
parents:
diff changeset
23 while (g_thread_run)
anatofuz
parents:
diff changeset
24 pthread_cond_wait(&cond, &mutex);
anatofuz
parents:
diff changeset
25 pthread_mutex_unlock(&mutex);
anatofuz
parents:
diff changeset
26 return 0;
anatofuz
parents:
diff changeset
27 }
anatofuz
parents:
diff changeset
28
anatofuz
parents:
diff changeset
29 int main() {
anatofuz
parents:
diff changeset
30 barrier_init(&barrier, 2);
anatofuz
parents:
diff changeset
31
anatofuz
parents:
diff changeset
32 pthread_mutex_init(&mutex, 0);
anatofuz
parents:
diff changeset
33 pthread_cond_init(&cond, 0);
anatofuz
parents:
diff changeset
34
anatofuz
parents:
diff changeset
35 signal(SIGUSR1, &sig_handler);
anatofuz
parents:
diff changeset
36 pthread_t thr;
anatofuz
parents:
diff changeset
37 pthread_create(&thr, 0, &my_thread, 0);
anatofuz
parents:
diff changeset
38 // wait for thread to get inside pthread_cond_wait
anatofuz
parents:
diff changeset
39 // (can't use barrier_wait for that)
anatofuz
parents:
diff changeset
40 sleep(1);
anatofuz
parents:
diff changeset
41 pthread_kill(thr, SIGUSR1);
anatofuz
parents:
diff changeset
42 barrier_wait(&barrier);
anatofuz
parents:
diff changeset
43 pthread_mutex_lock(&mutex);
anatofuz
parents:
diff changeset
44 g_thread_run = 0;
anatofuz
parents:
diff changeset
45 pthread_cond_signal(&cond);
anatofuz
parents:
diff changeset
46 pthread_mutex_unlock(&mutex);
anatofuz
parents:
diff changeset
47 pthread_join(thr, 0);
anatofuz
parents:
diff changeset
48 fprintf(stderr, "DONE\n");
anatofuz
parents:
diff changeset
49 return 0;
anatofuz
parents:
diff changeset
50 }
anatofuz
parents:
diff changeset
51
anatofuz
parents:
diff changeset
52 // CHECK: SIGNAL
anatofuz
parents:
diff changeset
53 // CHECK: DONE