brintos

brintos / llvm-project-archived public Read only

0
0
Text · 1.2 KiB · 6c20dd8 Raw
54 lines · cpp
1// RUN: %clang_tsan -O1 %s -o %t && %run %t 2>&1 | FileCheck %s2#include "test.h"3#include <signal.h>4#include <unistd.h>5#include <errno.h>6#include <semaphore.h>7 8// Test that signals can be delivered to blocked pthread_cond_wait.9// https://github.com/google/sanitizers/issues/49810 11int g_thread_run = 1;12pthread_mutex_t mutex;13pthread_cond_t cond;14 15void sig_handler(int sig) {16  (void)sig;17  write(2, "SIGNAL\n", sizeof("SIGNAL\n") - 1);18  barrier_wait(&barrier);19}20 21void* my_thread(void* arg) {22  pthread_mutex_lock(&mutex);23  while (g_thread_run)24    pthread_cond_wait(&cond, &mutex);25  pthread_mutex_unlock(&mutex);26  return 0;27}28 29int main() {30  barrier_init(&barrier, 2);31 32  pthread_mutex_init(&mutex, 0);33  pthread_cond_init(&cond, 0);34 35  signal(SIGUSR1, &sig_handler);36  pthread_t thr;37  pthread_create(&thr, 0, &my_thread, 0);38  // wait for thread to get inside pthread_cond_wait39  // (can't use barrier_wait for that)40  sleep(1);41  pthread_kill(thr, SIGUSR1);42  barrier_wait(&barrier);43  pthread_mutex_lock(&mutex);44  g_thread_run = 0;45  pthread_cond_signal(&cond);46  pthread_mutex_unlock(&mutex);47  pthread_join(thr, 0);48  fprintf(stderr, "DONE\n");49  return 0;50}51 52// CHECK: SIGNAL53// CHECK: DONE54