1*4f1223e8SApple OSS Distributions #include <pthread.h>
2*4f1223e8SApple OSS Distributions #include <stdbool.h>
3*4f1223e8SApple OSS Distributions #include <signal.h>
4*4f1223e8SApple OSS Distributions #include <stdio.h>
5*4f1223e8SApple OSS Distributions #include <string.h>
6*4f1223e8SApple OSS Distributions #include <unistd.h>
7*4f1223e8SApple OSS Distributions #include <sys/time.h>
8*4f1223e8SApple OSS Distributions #include <mach/mach_time.h>
9*4f1223e8SApple OSS Distributions #include <dispatch/dispatch.h>
10*4f1223e8SApple OSS Distributions
11*4f1223e8SApple OSS Distributions #include <darwintest.h>
12*4f1223e8SApple OSS Distributions
13*4f1223e8SApple OSS Distributions T_GLOBAL_META(
14*4f1223e8SApple OSS Distributions T_META_NAMESPACE("xnu.workq"),
15*4f1223e8SApple OSS Distributions T_META_RADAR_COMPONENT_NAME("xnu"),
16*4f1223e8SApple OSS Distributions T_META_RADAR_COMPONENT_VERSION("workq"),
17*4f1223e8SApple OSS Distributions T_META_RUN_CONCURRENTLY(true));
18*4f1223e8SApple OSS Distributions
19*4f1223e8SApple OSS Distributions
20*4f1223e8SApple OSS Distributions static pthread_t workq_thread;
21*4f1223e8SApple OSS Distributions static bool signal_received;
22*4f1223e8SApple OSS Distributions
23*4f1223e8SApple OSS Distributions static void
signal_handler(int sig __unused,siginfo_t * b __unused,void * unused __unused)24*4f1223e8SApple OSS Distributions signal_handler(int sig __unused, siginfo_t *b __unused, void* unused __unused)
25*4f1223e8SApple OSS Distributions {
26*4f1223e8SApple OSS Distributions if (pthread_self() == workq_thread) {
27*4f1223e8SApple OSS Distributions signal_received = true;
28*4f1223e8SApple OSS Distributions }
29*4f1223e8SApple OSS Distributions }
30*4f1223e8SApple OSS Distributions
31*4f1223e8SApple OSS Distributions static void
workq_block(void * unused __unused)32*4f1223e8SApple OSS Distributions workq_block(void *unused __unused)
33*4f1223e8SApple OSS Distributions {
34*4f1223e8SApple OSS Distributions workq_thread = pthread_self();
35*4f1223e8SApple OSS Distributions
36*4f1223e8SApple OSS Distributions /*
37*4f1223e8SApple OSS Distributions * sigset_t set;
38*4f1223e8SApple OSS Distributions * sigemptyset(&set);
39*4f1223e8SApple OSS Distributions * sigaddset(&set, SIGPROF);
40*4f1223e8SApple OSS Distributions * pthread_sigmask(SIG_UNBLOCK, &set, NULL);
41*4f1223e8SApple OSS Distributions */
42*4f1223e8SApple OSS Distributions
43*4f1223e8SApple OSS Distributions uint64_t spin_start = mach_absolute_time();
44*4f1223e8SApple OSS Distributions while (mach_absolute_time() - spin_start < 30 * NSEC_PER_SEC) {
45*4f1223e8SApple OSS Distributions if (signal_received) {
46*4f1223e8SApple OSS Distributions T_PASS("Got SIGPROF!");
47*4f1223e8SApple OSS Distributions T_END;
48*4f1223e8SApple OSS Distributions }
49*4f1223e8SApple OSS Distributions }
50*4f1223e8SApple OSS Distributions }
51*4f1223e8SApple OSS Distributions
52*4f1223e8SApple OSS Distributions T_DECL(workq_sigprof, "test that workqueue threads can receive sigprof", T_META_TAG_VM_PREFERRED)
53*4f1223e8SApple OSS Distributions {
54*4f1223e8SApple OSS Distributions struct sigaction sa = {
55*4f1223e8SApple OSS Distributions .sa_sigaction = signal_handler
56*4f1223e8SApple OSS Distributions };
57*4f1223e8SApple OSS Distributions sigfillset(&sa.sa_mask);
58*4f1223e8SApple OSS Distributions T_ASSERT_POSIX_ZERO(sigaction(SIGPROF, &sa, NULL), NULL);
59*4f1223e8SApple OSS Distributions
60*4f1223e8SApple OSS Distributions dispatch_queue_t q = dispatch_get_global_queue(0, 0);
61*4f1223e8SApple OSS Distributions dispatch_async_f(q, NULL, workq_block);
62*4f1223e8SApple OSS Distributions
63*4f1223e8SApple OSS Distributions struct itimerval timerval = {
64*4f1223e8SApple OSS Distributions .it_interval = {.tv_usec = 10000},
65*4f1223e8SApple OSS Distributions .it_value = {.tv_usec = 10000}
66*4f1223e8SApple OSS Distributions };
67*4f1223e8SApple OSS Distributions T_ASSERT_POSIX_ZERO(setitimer(ITIMER_PROF, &timerval, NULL), NULL);
68*4f1223e8SApple OSS Distributions
69*4f1223e8SApple OSS Distributions dispatch_main();
70*4f1223e8SApple OSS Distributions }
71