10172c8cd8ec72ae11e7b2a2b65b54466ea75de9cAlexey Samsonov// RUN: %clang_tsan -O1 %s -o %t && not %t 2>&1 | FileCheck %s
2785425a53261bb52ffcd972a3655a539dbe3731eDmitry Vyukov#include <pthread.h>
3785425a53261bb52ffcd972a3655a539dbe3731eDmitry Vyukov#include <stdio.h>
4785425a53261bb52ffcd972a3655a539dbe3731eDmitry Vyukov#include <stdlib.h>
5785425a53261bb52ffcd972a3655a539dbe3731eDmitry Vyukov#include <signal.h>
6785425a53261bb52ffcd972a3655a539dbe3731eDmitry Vyukov#include <sys/types.h>
7785425a53261bb52ffcd972a3655a539dbe3731eDmitry Vyukov#include <unistd.h>
8785425a53261bb52ffcd972a3655a539dbe3731eDmitry Vyukov#include <errno.h>
9785425a53261bb52ffcd972a3655a539dbe3731eDmitry Vyukov
10785425a53261bb52ffcd972a3655a539dbe3731eDmitry Vyukovpthread_t mainth;
11785425a53261bb52ffcd972a3655a539dbe3731eDmitry Vyukovvolatile int done;
12785425a53261bb52ffcd972a3655a539dbe3731eDmitry Vyukov
132f588f9d3417aa107ebbbd8830f97501023d3f40Kostya Serebryanystatic void MyHandler(int, siginfo_t *s, void *c) {
14785425a53261bb52ffcd972a3655a539dbe3731eDmitry Vyukov  errno = 1;
15785425a53261bb52ffcd972a3655a539dbe3731eDmitry Vyukov  done = 1;
16785425a53261bb52ffcd972a3655a539dbe3731eDmitry Vyukov}
17785425a53261bb52ffcd972a3655a539dbe3731eDmitry Vyukov
18ed513f69b8017a69214509105e7ec59fec77b468Dmitry Vyukovstatic void* sendsignal(void *p) {
19785425a53261bb52ffcd972a3655a539dbe3731eDmitry Vyukov  pthread_kill(mainth, SIGPROF);
20785425a53261bb52ffcd972a3655a539dbe3731eDmitry Vyukov  return 0;
21785425a53261bb52ffcd972a3655a539dbe3731eDmitry Vyukov}
22785425a53261bb52ffcd972a3655a539dbe3731eDmitry Vyukov
23785425a53261bb52ffcd972a3655a539dbe3731eDmitry Vyukovint main() {
24785425a53261bb52ffcd972a3655a539dbe3731eDmitry Vyukov  mainth = pthread_self();
25785425a53261bb52ffcd972a3655a539dbe3731eDmitry Vyukov  struct sigaction act = {};
262f588f9d3417aa107ebbbd8830f97501023d3f40Kostya Serebryany  act.sa_sigaction = &MyHandler;
27785425a53261bb52ffcd972a3655a539dbe3731eDmitry Vyukov  sigaction(SIGPROF, &act, 0);
28785425a53261bb52ffcd972a3655a539dbe3731eDmitry Vyukov  pthread_t th;
29785425a53261bb52ffcd972a3655a539dbe3731eDmitry Vyukov  pthread_create(&th, 0, sendsignal, 0);
30785425a53261bb52ffcd972a3655a539dbe3731eDmitry Vyukov  while (done == 0) {
31785425a53261bb52ffcd972a3655a539dbe3731eDmitry Vyukov    volatile char *p = (char*)malloc(1);
32785425a53261bb52ffcd972a3655a539dbe3731eDmitry Vyukov    p[0] = 0;
33785425a53261bb52ffcd972a3655a539dbe3731eDmitry Vyukov    free((void*)p);
34785425a53261bb52ffcd972a3655a539dbe3731eDmitry Vyukov    pthread_yield();
35785425a53261bb52ffcd972a3655a539dbe3731eDmitry Vyukov  }
36785425a53261bb52ffcd972a3655a539dbe3731eDmitry Vyukov  pthread_join(th, 0);
37785425a53261bb52ffcd972a3655a539dbe3731eDmitry Vyukov  return 0;
38785425a53261bb52ffcd972a3655a539dbe3731eDmitry Vyukov}
39785425a53261bb52ffcd972a3655a539dbe3731eDmitry Vyukov
40785425a53261bb52ffcd972a3655a539dbe3731eDmitry Vyukov// CHECK: WARNING: ThreadSanitizer: signal handler spoils errno
412f588f9d3417aa107ebbbd8830f97501023d3f40Kostya Serebryany// CHECK:     #0 MyHandler(int, siginfo{{(_t)?}}*, void*) {{.*}}signal_errno.cc
422f588f9d3417aa107ebbbd8830f97501023d3f40Kostya Serebryany// CHECK: SUMMARY: ThreadSanitizer: signal handler spoils errno{{.*}}MyHandler
43785425a53261bb52ffcd972a3655a539dbe3731eDmitry Vyukov
44