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