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