16a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines// RUN: %clang_tsan -O1 %s -o %t && %deflake %run %t | FileCheck %s 23d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar// This test fails on powerpc64 BE (VMA=44), it does not appear to be 33d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar// a functional problem, but the Tsan report is missing some info. 43d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar// XFAIL: powerpc64-unknown-linux-gnu 53d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar 686277eb844c4983c81de62d7c050e92fe7155788Stephen Hines#include "test.h" 7785425a53261bb52ffcd972a3655a539dbe3731eDmitry Vyukov#include <signal.h> 8785425a53261bb52ffcd972a3655a539dbe3731eDmitry Vyukov#include <sys/types.h> 9785425a53261bb52ffcd972a3655a539dbe3731eDmitry Vyukov#include <errno.h> 10785425a53261bb52ffcd972a3655a539dbe3731eDmitry Vyukov 11785425a53261bb52ffcd972a3655a539dbe3731eDmitry Vyukovpthread_t mainth; 12785425a53261bb52ffcd972a3655a539dbe3731eDmitry Vyukovvolatile int done; 13785425a53261bb52ffcd972a3655a539dbe3731eDmitry Vyukov 142f588f9d3417aa107ebbbd8830f97501023d3f40Kostya Serebryanystatic void MyHandler(int, siginfo_t *s, void *c) { 15785425a53261bb52ffcd972a3655a539dbe3731eDmitry Vyukov errno = 1; 16785425a53261bb52ffcd972a3655a539dbe3731eDmitry Vyukov done = 1; 17785425a53261bb52ffcd972a3655a539dbe3731eDmitry Vyukov} 18785425a53261bb52ffcd972a3655a539dbe3731eDmitry Vyukov 19ed513f69b8017a69214509105e7ec59fec77b468Dmitry Vyukovstatic void* sendsignal(void *p) { 2086277eb844c4983c81de62d7c050e92fe7155788Stephen Hines barrier_wait(&barrier); 21785425a53261bb52ffcd972a3655a539dbe3731eDmitry Vyukov pthread_kill(mainth, SIGPROF); 22785425a53261bb52ffcd972a3655a539dbe3731eDmitry Vyukov return 0; 23785425a53261bb52ffcd972a3655a539dbe3731eDmitry Vyukov} 24785425a53261bb52ffcd972a3655a539dbe3731eDmitry Vyukov 252d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesstatic __attribute__((noinline)) void loop() { 2686277eb844c4983c81de62d7c050e92fe7155788Stephen Hines barrier_wait(&barrier); 272d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines while (done == 0) { 282d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines volatile char *p = (char*)malloc(1); 292d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines p[0] = 0; 302d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines free((void*)p); 313d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar sched_yield(); 322d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines } 332d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines} 342d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 35785425a53261bb52ffcd972a3655a539dbe3731eDmitry Vyukovint main() { 3686277eb844c4983c81de62d7c050e92fe7155788Stephen Hines barrier_init(&barrier, 2); 37785425a53261bb52ffcd972a3655a539dbe3731eDmitry Vyukov mainth = pthread_self(); 38785425a53261bb52ffcd972a3655a539dbe3731eDmitry Vyukov struct sigaction act = {}; 392f588f9d3417aa107ebbbd8830f97501023d3f40Kostya Serebryany act.sa_sigaction = &MyHandler; 40785425a53261bb52ffcd972a3655a539dbe3731eDmitry Vyukov sigaction(SIGPROF, &act, 0); 41785425a53261bb52ffcd972a3655a539dbe3731eDmitry Vyukov pthread_t th; 42785425a53261bb52ffcd972a3655a539dbe3731eDmitry Vyukov pthread_create(&th, 0, sendsignal, 0); 432d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines loop(); 44785425a53261bb52ffcd972a3655a539dbe3731eDmitry Vyukov pthread_join(th, 0); 45785425a53261bb52ffcd972a3655a539dbe3731eDmitry Vyukov return 0; 46785425a53261bb52ffcd972a3655a539dbe3731eDmitry Vyukov} 47785425a53261bb52ffcd972a3655a539dbe3731eDmitry Vyukov 48785425a53261bb52ffcd972a3655a539dbe3731eDmitry Vyukov// CHECK: WARNING: ThreadSanitizer: signal handler spoils errno 496d1862363c88c183b0ed7740fca876342cf0474bStephen Hines// CHECK: #0 MyHandler(int, {{(__)?}}siginfo{{(_t)?}}*, void*) {{.*}}signal_errno.cc 502d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// CHECK: main 512f588f9d3417aa107ebbbd8830f97501023d3f40Kostya Serebryany// CHECK: SUMMARY: ThreadSanitizer: signal handler spoils errno{{.*}}MyHandler 52785425a53261bb52ffcd972a3655a539dbe3731eDmitry Vyukov 53