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