brintos

brintos / llvm-project-archived public Read only

0
0
Text · 1.4 KiB · 209dc22 Raw
76 lines · cpp
1// RUN: %clangxx_tsan %s -o %t && %run %t 2>&1 | FileCheck %s2 3#include <pthread.h>4#include <stdio.h>5#include <stdlib.h>6#include <signal.h>7#include <sys/types.h>8#include <sys/time.h>9#include <unistd.h>10#include <errno.h>11 12volatile bool signal_delivered;13 14static void handler(int sig) {15  if (sig == SIGALRM)16    signal_delivered = true;17}18 19static void* thr(void *p) {20  sigset_t sigset;21  sigemptyset(&sigset);22  sigaddset(&sigset, SIGALRM);23  int ret = pthread_sigmask(SIG_UNBLOCK, &sigset, NULL);24  if (ret) abort();25 26  struct sigaction act = {};27  act.sa_handler = &handler;28  if (sigaction(SIGALRM, &act, 0)) {29    perror("sigaction");30    exit(1);31  }32 33  itimerval t;34  t.it_value.tv_sec = 0;35  t.it_value.tv_usec = 10000;36  t.it_interval = t.it_value;37  if (setitimer(ITIMER_REAL, &t, 0)) {38    perror("setitimer");39    exit(1);40  }41 42  while (!signal_delivered) {43    usleep(1000);44  }45 46  t.it_value.tv_usec = 0;47  if (setitimer(ITIMER_REAL, &t, 0)) {48    perror("setitimer");49    exit(1);50  }51 52  fprintf(stderr, "SIGNAL DELIVERED\n");53 54  return 0;55}56 57int main() {58  sigset_t sigset;59  sigemptyset(&sigset);60  sigaddset(&sigset, SIGALRM);61  int ret = pthread_sigmask(SIG_BLOCK, &sigset, NULL);62  if (ret) abort();63 64  pthread_t th;65  pthread_create(&th, 0, thr, 0);66  pthread_join(th, 0);67 68  fprintf(stderr, "DONE\n");69  return 0;70}71 72// CHECK-NOT: WARNING: ThreadSanitizer:73// CHECK: SIGNAL DELIVERED74// CHECK: DONE75// CHECK-NOT: WARNING: ThreadSanitizer:76