xref: /aosp_15_r20/external/compiler-rt/test/msan/sigwait.cc (revision 7c3d14c8b49c529e04be81a3ce6f5cc23712e4c6)
1*7c3d14c8STreehugger Robot // RUN: %clangxx_msan -std=c++11 -O0 -g %s -o %t && %run %t
2*7c3d14c8STreehugger Robot 
3*7c3d14c8STreehugger Robot #include <assert.h>
4*7c3d14c8STreehugger Robot #include <sanitizer/msan_interface.h>
5*7c3d14c8STreehugger Robot #include <signal.h>
6*7c3d14c8STreehugger Robot #include <sys/time.h>
7*7c3d14c8STreehugger Robot #include <unistd.h>
8*7c3d14c8STreehugger Robot 
test_sigwait()9*7c3d14c8STreehugger Robot void test_sigwait() {
10*7c3d14c8STreehugger Robot   sigset_t s;
11*7c3d14c8STreehugger Robot   sigemptyset(&s);
12*7c3d14c8STreehugger Robot   sigaddset(&s, SIGUSR1);
13*7c3d14c8STreehugger Robot   sigprocmask(SIG_BLOCK, &s, 0);
14*7c3d14c8STreehugger Robot 
15*7c3d14c8STreehugger Robot   if (pid_t pid = fork()) {
16*7c3d14c8STreehugger Robot     kill(pid, SIGUSR1);
17*7c3d14c8STreehugger Robot     _exit(0);
18*7c3d14c8STreehugger Robot   } else {
19*7c3d14c8STreehugger Robot     int sig;
20*7c3d14c8STreehugger Robot     int res = sigwait(&s, &sig);
21*7c3d14c8STreehugger Robot     assert(!res);
22*7c3d14c8STreehugger Robot     // The following checks that sig is initialized.
23*7c3d14c8STreehugger Robot     assert(sig == SIGUSR1);
24*7c3d14c8STreehugger Robot   }
25*7c3d14c8STreehugger Robot }
26*7c3d14c8STreehugger Robot 
main(void)27*7c3d14c8STreehugger Robot int main(void) {
28*7c3d14c8STreehugger Robot   test_sigwait();
29*7c3d14c8STreehugger Robot   return 0;
30*7c3d14c8STreehugger Robot }
31