]>
git.saurik.com Git - apple/xnu.git/blob - tests/workq_sigprof.c
458307962fce582345ba9cbe8b45518d0a3339c1
8 #include <mach/mach_time.h>
9 #include <dispatch/dispatch.h>
11 #include <darwintest.h>
15 static pthread_t workq_thread
;
16 static bool signal_received
;
19 signal_handler(int sig __unused
, siginfo_t
*b __unused
, void* unused __unused
)
21 if (pthread_self() == workq_thread
) {
22 signal_received
= true;
27 workq_block(void *unused __unused
)
29 workq_thread
= pthread_self();
34 * sigaddset(&set, SIGPROF);
35 * pthread_sigmask(SIG_UNBLOCK, &set, NULL);
38 uint64_t spin_start
= mach_absolute_time();
39 while (mach_absolute_time() - spin_start
< 30 * NSEC_PER_SEC
) {
40 if (signal_received
) {
41 T_PASS("Got SIGPROF!");
47 T_DECL(workq_sigprof
, "test that workqueue threads can receive sigprof")
49 struct sigaction sa
= {
50 .sa_sigaction
= signal_handler
52 sigfillset(&sa
.sa_mask
);
53 T_ASSERT_POSIX_ZERO(sigaction(SIGPROF
, &sa
, NULL
), NULL
);
55 dispatch_queue_t q
= dispatch_get_global_queue(0, 0);
56 dispatch_async_f(q
, NULL
, workq_block
);
58 struct itimerval timerval
= {
59 .it_interval
= {.tv_usec
= 10000},
60 .it_value
= {.tv_usec
= 10000}
62 T_ASSERT_POSIX_ZERO(setitimer(ITIMER_PROF
, &timerval
, NULL
), NULL
);
67 #else //!TARGET_OS_IPHONE
69 T_DECL(workq_sigprof
, "test that workqueue threads can receive sigprof")
72 T_FAIL("<rdar://problem/25864196> setitimer/sigprof doesn't seem to be delivered on embeded platforms");
75 #endif //!TARGET_OS_IPHONE