xref: /llvm-project/compiler-rt/test/tsan/signal_thread2.cpp (revision 3a13c5a2862fdc957d751a7679581d5da151efc2)
13056ccdbSDmitry Vyukov // RUN: %clangxx_tsan %s -o %t && %run %t 2>&1 | FileCheck %s
23056ccdbSDmitry Vyukov // UNSUPPORTED: darwin
33056ccdbSDmitry Vyukov 
4*3a13c5a2SVitaly Buka // FIXME: Very flaky on PPC with COMPILER_RT_DEBUG.
5*3a13c5a2SVitaly Buka // https://github.com/google/sanitizers/issues/1792
616a2aa32SVitaly Buka // UNSUPPORTED: !compiler-rt-optimized && ppc
716a2aa32SVitaly Buka 
83056ccdbSDmitry Vyukov // Test case for https://github.com/google/sanitizers/issues/1540
93056ccdbSDmitry Vyukov 
103056ccdbSDmitry Vyukov #include <errno.h>
113056ccdbSDmitry Vyukov #include <pthread.h>
123056ccdbSDmitry Vyukov #include <signal.h>
133056ccdbSDmitry Vyukov #include <stdio.h>
143056ccdbSDmitry Vyukov #include <stdlib.h>
153056ccdbSDmitry Vyukov #include <sys/time.h>
163056ccdbSDmitry Vyukov #include <sys/types.h>
173056ccdbSDmitry Vyukov #include <unistd.h>
183056ccdbSDmitry Vyukov 
193056ccdbSDmitry Vyukov volatile int X;
203056ccdbSDmitry Vyukov 
213056ccdbSDmitry Vyukov static void handler(int sig) {
223056ccdbSDmitry Vyukov   (void)sig;
233056ccdbSDmitry Vyukov   if (X != 0)
243056ccdbSDmitry Vyukov     printf("bad");
253056ccdbSDmitry Vyukov }
263056ccdbSDmitry Vyukov 
273056ccdbSDmitry Vyukov static void *thr1(void *p) {
283056ccdbSDmitry Vyukov   sleep(1);
293056ccdbSDmitry Vyukov   return 0;
303056ccdbSDmitry Vyukov }
313056ccdbSDmitry Vyukov 
323056ccdbSDmitry Vyukov static void *thr(void *p) {
333056ccdbSDmitry Vyukov   pthread_t th[10];
343056ccdbSDmitry Vyukov   for (int i = 0; i < sizeof(th) / sizeof(th[0]); i++)
353056ccdbSDmitry Vyukov     pthread_create(&th[i], 0, thr1, 0);
363056ccdbSDmitry Vyukov   for (int i = 0; i < sizeof(th) / sizeof(th[0]); i++)
373056ccdbSDmitry Vyukov     pthread_join(th[i], 0);
383056ccdbSDmitry Vyukov   return 0;
393056ccdbSDmitry Vyukov }
403056ccdbSDmitry Vyukov 
413056ccdbSDmitry Vyukov int main() {
423056ccdbSDmitry Vyukov   struct sigaction act = {};
433056ccdbSDmitry Vyukov   act.sa_handler = &handler;
444acd84e7SVitaly Buka   if (sigaction(SIGPROF, &act, 0)) {
453056ccdbSDmitry Vyukov     perror("sigaction");
463056ccdbSDmitry Vyukov     exit(1);
473056ccdbSDmitry Vyukov   }
483056ccdbSDmitry Vyukov 
493056ccdbSDmitry Vyukov   itimerval t;
503056ccdbSDmitry Vyukov   t.it_value.tv_sec = 0;
513056ccdbSDmitry Vyukov   t.it_value.tv_usec = 10;
523056ccdbSDmitry Vyukov   t.it_interval = t.it_value;
534acd84e7SVitaly Buka   if (setitimer(ITIMER_PROF, &t, 0)) {
543056ccdbSDmitry Vyukov     perror("setitimer");
553056ccdbSDmitry Vyukov     exit(1);
563056ccdbSDmitry Vyukov   }
573056ccdbSDmitry Vyukov 
583056ccdbSDmitry Vyukov   pthread_t th[100];
593056ccdbSDmitry Vyukov   for (int i = 0; i < sizeof(th) / sizeof(th[0]); i++)
603056ccdbSDmitry Vyukov     pthread_create(&th[i], 0, thr, 0);
613056ccdbSDmitry Vyukov   for (int i = 0; i < sizeof(th) / sizeof(th[0]); i++)
623056ccdbSDmitry Vyukov     pthread_join(th[i], 0);
633056ccdbSDmitry Vyukov 
643056ccdbSDmitry Vyukov   fprintf(stderr, "DONE\n");
653056ccdbSDmitry Vyukov   return 0;
663056ccdbSDmitry Vyukov }
673056ccdbSDmitry Vyukov 
683056ccdbSDmitry Vyukov // CHECK-NOT: WARNING: ThreadSanitizer:
693056ccdbSDmitry Vyukov // CHECK: DONE
703056ccdbSDmitry Vyukov // CHECK-NOT: WARNING: ThreadSanitizer:
71