1*0f4c859eSApple OSS Distributions /*
2*0f4c859eSApple OSS Distributions * mach eventlink: Tests mach eventlink kernel synchronization primitive.
3*0f4c859eSApple OSS Distributions */
4*0f4c859eSApple OSS Distributions
5*0f4c859eSApple OSS Distributions #include <darwintest.h>
6*0f4c859eSApple OSS Distributions #include <darwintest_multiprocess.h>
7*0f4c859eSApple OSS Distributions
8*0f4c859eSApple OSS Distributions #include <pthread.h>
9*0f4c859eSApple OSS Distributions #include <launch.h>
10*0f4c859eSApple OSS Distributions #include <mach/mach.h>
11*0f4c859eSApple OSS Distributions #include <mach/message.h>
12*0f4c859eSApple OSS Distributions #include <mach/mach_voucher.h>
13*0f4c859eSApple OSS Distributions #include <pthread/workqueue_private.h>
14*0f4c859eSApple OSS Distributions #include <voucher/ipc_pthread_priority_types.h>
15*0f4c859eSApple OSS Distributions #include <servers/bootstrap.h>
16*0f4c859eSApple OSS Distributions #include <stdlib.h>
17*0f4c859eSApple OSS Distributions #include <sys/event.h>
18*0f4c859eSApple OSS Distributions #include <unistd.h>
19*0f4c859eSApple OSS Distributions #include <crt_externs.h>
20*0f4c859eSApple OSS Distributions #include <signal.h>
21*0f4c859eSApple OSS Distributions #include <sys/types.h>
22*0f4c859eSApple OSS Distributions #include <sys/sysctl.h>
23*0f4c859eSApple OSS Distributions #include <libkern/OSAtomic.h>
24*0f4c859eSApple OSS Distributions #include <sys/wait.h>
25*0f4c859eSApple OSS Distributions #include <spawn.h>
26*0f4c859eSApple OSS Distributions #include <spawn_private.h>
27*0f4c859eSApple OSS Distributions #include <mach/mach_eventlink.h>
28*0f4c859eSApple OSS Distributions
29*0f4c859eSApple OSS Distributions T_GLOBAL_META(T_META_NAMESPACE("xnu.mach_eventlink"),
30*0f4c859eSApple OSS Distributions T_META_RUN_CONCURRENTLY(true));
31*0f4c859eSApple OSS Distributions
32*0f4c859eSApple OSS Distributions static kern_return_t
test_eventlink_create(mach_port_t * port_pair)33*0f4c859eSApple OSS Distributions test_eventlink_create(mach_port_t *port_pair)
34*0f4c859eSApple OSS Distributions {
35*0f4c859eSApple OSS Distributions kern_return_t kr;
36*0f4c859eSApple OSS Distributions
37*0f4c859eSApple OSS Distributions kr = mach_eventlink_create(mach_task_self(), MELC_OPTION_NO_COPYIN, port_pair);
38*0f4c859eSApple OSS Distributions T_ASSERT_MACH_SUCCESS(kr, "mach_eventlink_create");
39*0f4c859eSApple OSS Distributions
40*0f4c859eSApple OSS Distributions return kr;
41*0f4c859eSApple OSS Distributions }
42*0f4c859eSApple OSS Distributions
43*0f4c859eSApple OSS Distributions static pthread_t
thread_create_for_test(void * (* function)(void *),void * arg)44*0f4c859eSApple OSS Distributions thread_create_for_test(void * (*function)(void *), void *arg)
45*0f4c859eSApple OSS Distributions {
46*0f4c859eSApple OSS Distributions pthread_t pthread;
47*0f4c859eSApple OSS Distributions pthread_attr_t attr;
48*0f4c859eSApple OSS Distributions
49*0f4c859eSApple OSS Distributions pthread_attr_init(&attr);
50*0f4c859eSApple OSS Distributions pthread_create(&pthread, &attr, function, arg);
51*0f4c859eSApple OSS Distributions
52*0f4c859eSApple OSS Distributions T_LOG("pthread created\n");
53*0f4c859eSApple OSS Distributions return pthread;
54*0f4c859eSApple OSS Distributions }
55*0f4c859eSApple OSS Distributions
56*0f4c859eSApple OSS Distributions static void *
while1loop(void * arg)57*0f4c859eSApple OSS Distributions while1loop(void *arg)
58*0f4c859eSApple OSS Distributions {
59*0f4c859eSApple OSS Distributions arg = NULL;
60*0f4c859eSApple OSS Distributions while (1) {
61*0f4c859eSApple OSS Distributions ;
62*0f4c859eSApple OSS Distributions }
63*0f4c859eSApple OSS Distributions return NULL;
64*0f4c859eSApple OSS Distributions }
65*0f4c859eSApple OSS Distributions
66*0f4c859eSApple OSS Distributions static void *
test_eventlink_wait_with_timeout(void * arg)67*0f4c859eSApple OSS Distributions test_eventlink_wait_with_timeout(void *arg)
68*0f4c859eSApple OSS Distributions {
69*0f4c859eSApple OSS Distributions kern_return_t kr;
70*0f4c859eSApple OSS Distributions mach_port_t eventlink_port = (mach_port_t) (uintptr_t)arg;
71*0f4c859eSApple OSS Distributions mach_port_t self = mach_thread_self();
72*0f4c859eSApple OSS Distributions uint64_t ticks = mach_absolute_time();
73*0f4c859eSApple OSS Distributions uint64_t count = 1;
74*0f4c859eSApple OSS Distributions
75*0f4c859eSApple OSS Distributions /* Associate thread with eventlink port */
76*0f4c859eSApple OSS Distributions kr = mach_eventlink_associate(eventlink_port, self, 0, 0, 0, 0, MELA_OPTION_NONE);
77*0f4c859eSApple OSS Distributions T_ASSERT_MACH_SUCCESS(kr, "mach_eventlink_associate");
78*0f4c859eSApple OSS Distributions
79*0f4c859eSApple OSS Distributions /* Wait on the eventlink with timeout */
80*0f4c859eSApple OSS Distributions kr = mach_eventlink_wait_until(eventlink_port, &count, MELSW_OPTION_NONE,
81*0f4c859eSApple OSS Distributions KERN_CLOCK_MACH_ABSOLUTE_TIME, ticks + 5000);
82*0f4c859eSApple OSS Distributions
83*0f4c859eSApple OSS Distributions T_EXPECT_MACH_ERROR(kr, KERN_OPERATION_TIMED_OUT, "mach_eventlink_wait_until returned expected error");
84*0f4c859eSApple OSS Distributions T_EXPECT_EQ(count, (uint64_t)0, "mach_eventlink_wait_until returned correct count value");
85*0f4c859eSApple OSS Distributions
86*0f4c859eSApple OSS Distributions return NULL;
87*0f4c859eSApple OSS Distributions }
88*0f4c859eSApple OSS Distributions
89*0f4c859eSApple OSS Distributions static void *
test_eventlink_wait_no_wait(void * arg)90*0f4c859eSApple OSS Distributions test_eventlink_wait_no_wait(void *arg)
91*0f4c859eSApple OSS Distributions {
92*0f4c859eSApple OSS Distributions kern_return_t kr;
93*0f4c859eSApple OSS Distributions mach_port_t eventlink_port = (mach_port_t) (uintptr_t)arg;
94*0f4c859eSApple OSS Distributions mach_port_t self = mach_thread_self();
95*0f4c859eSApple OSS Distributions uint64_t count = 1;
96*0f4c859eSApple OSS Distributions
97*0f4c859eSApple OSS Distributions /* Associate thread with eventlink port */
98*0f4c859eSApple OSS Distributions kr = mach_eventlink_associate(eventlink_port, self, 0, 0, 0, 0, MELA_OPTION_NONE);
99*0f4c859eSApple OSS Distributions T_ASSERT_MACH_SUCCESS(kr, "mach_eventlink_associate");
100*0f4c859eSApple OSS Distributions
101*0f4c859eSApple OSS Distributions /* Wait on the eventlink */
102*0f4c859eSApple OSS Distributions kr = mach_eventlink_wait_until(eventlink_port, &count, MELSW_OPTION_NO_WAIT,
103*0f4c859eSApple OSS Distributions KERN_CLOCK_MACH_ABSOLUTE_TIME, 0);
104*0f4c859eSApple OSS Distributions
105*0f4c859eSApple OSS Distributions T_EXPECT_MACH_ERROR(kr, KERN_OPERATION_TIMED_OUT, "mach_eventlink_wait_until returned expected error");
106*0f4c859eSApple OSS Distributions T_EXPECT_EQ(count, (uint64_t)0, "mach_eventlink_wait_until returned correct count value");
107*0f4c859eSApple OSS Distributions
108*0f4c859eSApple OSS Distributions return NULL;
109*0f4c859eSApple OSS Distributions }
110*0f4c859eSApple OSS Distributions
111*0f4c859eSApple OSS Distributions static void *
test_eventlink_wait_destroy(void * arg)112*0f4c859eSApple OSS Distributions test_eventlink_wait_destroy(void *arg)
113*0f4c859eSApple OSS Distributions {
114*0f4c859eSApple OSS Distributions kern_return_t kr;
115*0f4c859eSApple OSS Distributions mach_port_t eventlink_port = (mach_port_t) (uintptr_t)arg;
116*0f4c859eSApple OSS Distributions mach_port_t self = mach_thread_self();
117*0f4c859eSApple OSS Distributions uint64_t count = 1;
118*0f4c859eSApple OSS Distributions
119*0f4c859eSApple OSS Distributions /* Associate thread with eventlink port */
120*0f4c859eSApple OSS Distributions kr = mach_eventlink_associate(eventlink_port, self, 0, 0, 0, 0, MELA_OPTION_NONE);
121*0f4c859eSApple OSS Distributions T_ASSERT_MACH_SUCCESS(kr, "mach_eventlink_associate");
122*0f4c859eSApple OSS Distributions
123*0f4c859eSApple OSS Distributions /* Wait on the eventlink */
124*0f4c859eSApple OSS Distributions kr = mach_eventlink_wait_until(eventlink_port, &count, MELSW_OPTION_NONE,
125*0f4c859eSApple OSS Distributions KERN_CLOCK_MACH_ABSOLUTE_TIME, 0);
126*0f4c859eSApple OSS Distributions
127*0f4c859eSApple OSS Distributions T_EXPECT_MACH_ERROR(kr, KERN_TERMINATED, "mach_eventlink_wait_until returned expected error");
128*0f4c859eSApple OSS Distributions
129*0f4c859eSApple OSS Distributions return NULL;
130*0f4c859eSApple OSS Distributions }
131*0f4c859eSApple OSS Distributions
132*0f4c859eSApple OSS Distributions static void *
test_eventlink_wait_for_signal(void * arg)133*0f4c859eSApple OSS Distributions test_eventlink_wait_for_signal(void *arg)
134*0f4c859eSApple OSS Distributions {
135*0f4c859eSApple OSS Distributions kern_return_t kr;
136*0f4c859eSApple OSS Distributions mach_port_t eventlink_port = (mach_port_t) (uintptr_t)arg;
137*0f4c859eSApple OSS Distributions mach_port_t self = mach_thread_self();
138*0f4c859eSApple OSS Distributions uint64_t count = 0;
139*0f4c859eSApple OSS Distributions
140*0f4c859eSApple OSS Distributions /* Associate thread with eventlink port */
141*0f4c859eSApple OSS Distributions kr = mach_eventlink_associate(eventlink_port, self, 0, 0, 0, 0, MELA_OPTION_NONE);
142*0f4c859eSApple OSS Distributions T_ASSERT_MACH_SUCCESS(kr, "mach_eventlink_associate");
143*0f4c859eSApple OSS Distributions
144*0f4c859eSApple OSS Distributions /* Wait on the eventlink */
145*0f4c859eSApple OSS Distributions kr = mach_eventlink_wait_until(eventlink_port, &count, MELSW_OPTION_NONE,
146*0f4c859eSApple OSS Distributions KERN_CLOCK_MACH_ABSOLUTE_TIME, 0);
147*0f4c859eSApple OSS Distributions
148*0f4c859eSApple OSS Distributions T_ASSERT_MACH_SUCCESS(kr, "mach_eventlink_wait_until");
149*0f4c859eSApple OSS Distributions T_EXPECT_EQ(count, (uint64_t)1, "mach_eventlink_wait_until returned correct count value");
150*0f4c859eSApple OSS Distributions
151*0f4c859eSApple OSS Distributions return NULL;
152*0f4c859eSApple OSS Distributions }
153*0f4c859eSApple OSS Distributions
154*0f4c859eSApple OSS Distributions static void *
test_eventlink_wait_then_signal(void * arg)155*0f4c859eSApple OSS Distributions test_eventlink_wait_then_signal(void *arg)
156*0f4c859eSApple OSS Distributions {
157*0f4c859eSApple OSS Distributions kern_return_t kr;
158*0f4c859eSApple OSS Distributions mach_port_t eventlink_port = (mach_port_t) (uintptr_t)arg;
159*0f4c859eSApple OSS Distributions mach_port_t self = mach_thread_self();
160*0f4c859eSApple OSS Distributions uint64_t count = 0;
161*0f4c859eSApple OSS Distributions
162*0f4c859eSApple OSS Distributions /* Associate thread with eventlink port */
163*0f4c859eSApple OSS Distributions kr = mach_eventlink_associate(eventlink_port, self, 0, 0, 0, 0, MELA_OPTION_NONE);
164*0f4c859eSApple OSS Distributions T_ASSERT_MACH_SUCCESS(kr, "mach_eventlink_associate");
165*0f4c859eSApple OSS Distributions
166*0f4c859eSApple OSS Distributions /* Wait on the eventlink */
167*0f4c859eSApple OSS Distributions kr = mach_eventlink_wait_until(eventlink_port, &count, MELSW_OPTION_NONE,
168*0f4c859eSApple OSS Distributions KERN_CLOCK_MACH_ABSOLUTE_TIME, 0);
169*0f4c859eSApple OSS Distributions
170*0f4c859eSApple OSS Distributions T_ASSERT_MACH_SUCCESS(kr, "mach_eventlink_wait_until");
171*0f4c859eSApple OSS Distributions T_EXPECT_EQ(count, (uint64_t)1, "mach_eventlink_wait_until returned correct count value");
172*0f4c859eSApple OSS Distributions
173*0f4c859eSApple OSS Distributions /* Signal the eventlink to wakeup other side */
174*0f4c859eSApple OSS Distributions kr = mach_eventlink_signal(eventlink_port, 0);
175*0f4c859eSApple OSS Distributions T_ASSERT_MACH_SUCCESS(kr, "mach_eventlink_signal");
176*0f4c859eSApple OSS Distributions
177*0f4c859eSApple OSS Distributions return NULL;
178*0f4c859eSApple OSS Distributions }
179*0f4c859eSApple OSS Distributions
180*0f4c859eSApple OSS Distributions static void *
test_eventlink_wait_then_wait_signal_with_no_wait(void * arg)181*0f4c859eSApple OSS Distributions test_eventlink_wait_then_wait_signal_with_no_wait(void *arg)
182*0f4c859eSApple OSS Distributions {
183*0f4c859eSApple OSS Distributions kern_return_t kr;
184*0f4c859eSApple OSS Distributions mach_port_t eventlink_port = (mach_port_t) (uintptr_t)arg;
185*0f4c859eSApple OSS Distributions mach_port_t self = mach_thread_self();
186*0f4c859eSApple OSS Distributions uint64_t count = 0;
187*0f4c859eSApple OSS Distributions
188*0f4c859eSApple OSS Distributions /* Associate thread with eventlink port */
189*0f4c859eSApple OSS Distributions kr = mach_eventlink_associate(eventlink_port, self, 0, 0, 0, 0, MELA_OPTION_NONE);
190*0f4c859eSApple OSS Distributions T_ASSERT_MACH_SUCCESS(kr, "mach_eventlink_associate");
191*0f4c859eSApple OSS Distributions
192*0f4c859eSApple OSS Distributions /* Wait on the eventlink */
193*0f4c859eSApple OSS Distributions kr = mach_eventlink_wait_until(eventlink_port, &count, MELSW_OPTION_NONE,
194*0f4c859eSApple OSS Distributions KERN_CLOCK_MACH_ABSOLUTE_TIME, 0);
195*0f4c859eSApple OSS Distributions
196*0f4c859eSApple OSS Distributions T_ASSERT_MACH_SUCCESS(kr, "mach_eventlink_wait_until");
197*0f4c859eSApple OSS Distributions T_EXPECT_EQ(count, (uint64_t)1, "mach_eventlink_wait_until returned correct count value");
198*0f4c859eSApple OSS Distributions
199*0f4c859eSApple OSS Distributions /* Signal wait the eventlink */
200*0f4c859eSApple OSS Distributions kr = mach_eventlink_signal_wait_until(eventlink_port, &count, 0, MELSW_OPTION_NO_WAIT,
201*0f4c859eSApple OSS Distributions KERN_CLOCK_MACH_ABSOLUTE_TIME, 0);
202*0f4c859eSApple OSS Distributions
203*0f4c859eSApple OSS Distributions T_EXPECT_MACH_ERROR(kr, KERN_OPERATION_TIMED_OUT, "mach_eventlink_wait_until returned expected error");
204*0f4c859eSApple OSS Distributions T_EXPECT_EQ(count, (uint64_t)1, "mach_eventlink_wait_until returned correct count value");
205*0f4c859eSApple OSS Distributions
206*0f4c859eSApple OSS Distributions return NULL;
207*0f4c859eSApple OSS Distributions }
208*0f4c859eSApple OSS Distributions
209*0f4c859eSApple OSS Distributions static void *
test_eventlink_wait_then_wait_signal_with_prepost(void * arg)210*0f4c859eSApple OSS Distributions test_eventlink_wait_then_wait_signal_with_prepost(void *arg)
211*0f4c859eSApple OSS Distributions {
212*0f4c859eSApple OSS Distributions kern_return_t kr;
213*0f4c859eSApple OSS Distributions mach_port_t eventlink_port = (mach_port_t) (uintptr_t)arg;
214*0f4c859eSApple OSS Distributions mach_port_t self = mach_thread_self();
215*0f4c859eSApple OSS Distributions uint64_t count = 0;
216*0f4c859eSApple OSS Distributions
217*0f4c859eSApple OSS Distributions /* Associate thread with eventlink port */
218*0f4c859eSApple OSS Distributions kr = mach_eventlink_associate(eventlink_port, self, 0, 0, 0, 0, MELA_OPTION_NONE);
219*0f4c859eSApple OSS Distributions T_ASSERT_MACH_SUCCESS(kr, "mach_eventlink_associate");
220*0f4c859eSApple OSS Distributions
221*0f4c859eSApple OSS Distributions /* Wait on the eventlink */
222*0f4c859eSApple OSS Distributions kr = mach_eventlink_wait_until(eventlink_port, &count, MELSW_OPTION_NONE,
223*0f4c859eSApple OSS Distributions KERN_CLOCK_MACH_ABSOLUTE_TIME, 0);
224*0f4c859eSApple OSS Distributions
225*0f4c859eSApple OSS Distributions T_ASSERT_MACH_SUCCESS(kr, "mach_eventlink_wait_until");
226*0f4c859eSApple OSS Distributions T_EXPECT_EQ(count, (uint64_t)1, "mach_eventlink_wait_until returned correct count value");
227*0f4c859eSApple OSS Distributions
228*0f4c859eSApple OSS Distributions /* Signal wait the eventlink with stale counter value */
229*0f4c859eSApple OSS Distributions count = 0;
230*0f4c859eSApple OSS Distributions kr = mach_eventlink_signal_wait_until(eventlink_port, &count, 0, MELSW_OPTION_NONE,
231*0f4c859eSApple OSS Distributions KERN_CLOCK_MACH_ABSOLUTE_TIME, 0);
232*0f4c859eSApple OSS Distributions
233*0f4c859eSApple OSS Distributions T_ASSERT_MACH_SUCCESS(kr, "mach_eventlink_signal_wait_until");
234*0f4c859eSApple OSS Distributions T_EXPECT_EQ(count, (uint64_t)1, "mach_eventlink_wait_until returned correct count value");
235*0f4c859eSApple OSS Distributions
236*0f4c859eSApple OSS Distributions return NULL;
237*0f4c859eSApple OSS Distributions }
238*0f4c859eSApple OSS Distributions
239*0f4c859eSApple OSS Distributions static void *
test_eventlink_wait_then_signal_loop(void * arg)240*0f4c859eSApple OSS Distributions test_eventlink_wait_then_signal_loop(void *arg)
241*0f4c859eSApple OSS Distributions {
242*0f4c859eSApple OSS Distributions kern_return_t kr;
243*0f4c859eSApple OSS Distributions mach_port_t eventlink_port = (mach_port_t) (uintptr_t)arg;
244*0f4c859eSApple OSS Distributions mach_port_t self = mach_thread_self();
245*0f4c859eSApple OSS Distributions uint64_t count = 0;
246*0f4c859eSApple OSS Distributions int i;
247*0f4c859eSApple OSS Distributions
248*0f4c859eSApple OSS Distributions /* Associate thread with eventlink port */
249*0f4c859eSApple OSS Distributions kr = mach_eventlink_associate(eventlink_port, self, 0, 0, 0, 0, MELA_OPTION_NONE);
250*0f4c859eSApple OSS Distributions T_ASSERT_MACH_SUCCESS(kr, "mach_eventlink_associate");
251*0f4c859eSApple OSS Distributions
252*0f4c859eSApple OSS Distributions /* Wait on the eventlink */
253*0f4c859eSApple OSS Distributions kr = mach_eventlink_wait_until(eventlink_port, &count, MELSW_OPTION_NONE,
254*0f4c859eSApple OSS Distributions KERN_CLOCK_MACH_ABSOLUTE_TIME, 0);
255*0f4c859eSApple OSS Distributions
256*0f4c859eSApple OSS Distributions T_ASSERT_MACH_SUCCESS(kr, "mach_eventlink_wait_until");
257*0f4c859eSApple OSS Distributions T_EXPECT_EQ(count, (uint64_t)1, "mach_eventlink_wait_until returned correct count value");
258*0f4c859eSApple OSS Distributions
259*0f4c859eSApple OSS Distributions for (i = 1; i < 100; i++) {
260*0f4c859eSApple OSS Distributions /* Signal wait the eventlink */
261*0f4c859eSApple OSS Distributions kr = mach_eventlink_signal_wait_until(eventlink_port, &count, 0, MELSW_OPTION_NONE,
262*0f4c859eSApple OSS Distributions KERN_CLOCK_MACH_ABSOLUTE_TIME, 0);
263*0f4c859eSApple OSS Distributions
264*0f4c859eSApple OSS Distributions T_ASSERT_MACH_SUCCESS(kr, "mach_eventlink_signal_wait_until");
265*0f4c859eSApple OSS Distributions T_EXPECT_EQ(count, (uint64_t)(i + 1), "mach_eventlink_wait_until returned correct count value");
266*0f4c859eSApple OSS Distributions }
267*0f4c859eSApple OSS Distributions
268*0f4c859eSApple OSS Distributions /* Signal the eventlink to wakeup other side */
269*0f4c859eSApple OSS Distributions kr = mach_eventlink_signal(eventlink_port, 0);
270*0f4c859eSApple OSS Distributions T_ASSERT_MACH_SUCCESS(kr, "mach_eventlink_signal");
271*0f4c859eSApple OSS Distributions
272*0f4c859eSApple OSS Distributions return NULL;
273*0f4c859eSApple OSS Distributions }
274*0f4c859eSApple OSS Distributions
275*0f4c859eSApple OSS Distributions /*
276*0f4c859eSApple OSS Distributions * Test 1: Create ipc eventlink kernel object.
277*0f4c859eSApple OSS Distributions *
278*0f4c859eSApple OSS Distributions * Calls eventlink creates which returns a pair of eventlink port objects.
279*0f4c859eSApple OSS Distributions */
280*0f4c859eSApple OSS Distributions T_DECL(test_eventlink_create, "eventlink create test", T_META_ASROOT(YES))
281*0f4c859eSApple OSS Distributions {
282*0f4c859eSApple OSS Distributions kern_return_t kr;
283*0f4c859eSApple OSS Distributions mach_port_t port_pair[2];
284*0f4c859eSApple OSS Distributions
285*0f4c859eSApple OSS Distributions kr = test_eventlink_create(port_pair);
286*0f4c859eSApple OSS Distributions if (kr != KERN_SUCCESS) {
287*0f4c859eSApple OSS Distributions return;
288*0f4c859eSApple OSS Distributions }
289*0f4c859eSApple OSS Distributions
290*0f4c859eSApple OSS Distributions mach_port_deallocate(mach_task_self(), port_pair[0]);
291*0f4c859eSApple OSS Distributions mach_port_deallocate(mach_task_self(), port_pair[1]);
292*0f4c859eSApple OSS Distributions }
293*0f4c859eSApple OSS Distributions
294*0f4c859eSApple OSS Distributions /*
295*0f4c859eSApple OSS Distributions * Test 2: Create ipc eventlink kernel object and call eventlink destroy
296*0f4c859eSApple OSS Distributions *
297*0f4c859eSApple OSS Distributions * Calls eventlink creates which returns a pair of eventlink port objects.
298*0f4c859eSApple OSS Distributions * Calls eventlink destroy on eventlink port pair.
299*0f4c859eSApple OSS Distributions */
300*0f4c859eSApple OSS Distributions T_DECL(test_eventlink_destroy, "eventlink destroy test", T_META_ASROOT(YES))
301*0f4c859eSApple OSS Distributions {
302*0f4c859eSApple OSS Distributions kern_return_t kr;
303*0f4c859eSApple OSS Distributions mach_port_t port_pair[2];
304*0f4c859eSApple OSS Distributions
305*0f4c859eSApple OSS Distributions kr = test_eventlink_create(port_pair);
306*0f4c859eSApple OSS Distributions if (kr != KERN_SUCCESS) {
307*0f4c859eSApple OSS Distributions return;
308*0f4c859eSApple OSS Distributions }
309*0f4c859eSApple OSS Distributions
310*0f4c859eSApple OSS Distributions kr = mach_eventlink_destroy(port_pair[0]);
311*0f4c859eSApple OSS Distributions T_ASSERT_MACH_SUCCESS(kr, "mach_eventlink_destroy");
312*0f4c859eSApple OSS Distributions kr = mach_eventlink_destroy(port_pair[1]);
313*0f4c859eSApple OSS Distributions T_ASSERT_MACH_SUCCESS(kr, "mach_eventlink_destroy");
314*0f4c859eSApple OSS Distributions }
315*0f4c859eSApple OSS Distributions
316*0f4c859eSApple OSS Distributions /*
317*0f4c859eSApple OSS Distributions * Test 3: Associate threads to eventlink object.
318*0f4c859eSApple OSS Distributions *
319*0f4c859eSApple OSS Distributions * Create eventlink object pair and associate threads to each side and then
320*0f4c859eSApple OSS Distributions * disassociate threads and check for error conditions.
321*0f4c859eSApple OSS Distributions */
322*0f4c859eSApple OSS Distributions T_DECL(test_eventlink_associate, "eventlink associate test", T_META_ASROOT(YES))
323*0f4c859eSApple OSS Distributions {
324*0f4c859eSApple OSS Distributions kern_return_t kr;
325*0f4c859eSApple OSS Distributions mach_port_t port_pair[2];
326*0f4c859eSApple OSS Distributions mach_port_t self = mach_thread_self();
327*0f4c859eSApple OSS Distributions mach_port_t other_thread = MACH_PORT_NULL;
328*0f4c859eSApple OSS Distributions pthread_t pthread;
329*0f4c859eSApple OSS Distributions
330*0f4c859eSApple OSS Distributions /* eventlink associate to NULL eventlink object */
331*0f4c859eSApple OSS Distributions kr = mach_eventlink_associate(MACH_PORT_NULL, self, 0, 0, 0, 0, MELA_OPTION_NONE);
332*0f4c859eSApple OSS Distributions T_EXPECT_MACH_ERROR(kr, MACH_SEND_INVALID_DEST, "mach_eventlink_associate with null eventlink returned expected error");
333*0f4c859eSApple OSS Distributions
334*0f4c859eSApple OSS Distributions /* eventlink disassociate to NULL eventlink object */
335*0f4c859eSApple OSS Distributions kr = mach_eventlink_disassociate(MACH_PORT_NULL, MELD_OPTION_NONE);
336*0f4c859eSApple OSS Distributions T_EXPECT_MACH_ERROR(kr, MACH_SEND_INVALID_DEST, "mach_eventlink_disassociate with null eventlink returned expected error");
337*0f4c859eSApple OSS Distributions
338*0f4c859eSApple OSS Distributions /* Create an eventlink and associate threads to it */
339*0f4c859eSApple OSS Distributions kr = test_eventlink_create(port_pair);
340*0f4c859eSApple OSS Distributions if (kr != KERN_SUCCESS) {
341*0f4c859eSApple OSS Distributions return;
342*0f4c859eSApple OSS Distributions }
343*0f4c859eSApple OSS Distributions
344*0f4c859eSApple OSS Distributions pthread = thread_create_for_test(while1loop, NULL);
345*0f4c859eSApple OSS Distributions other_thread = pthread_mach_thread_np(pthread);
346*0f4c859eSApple OSS Distributions
347*0f4c859eSApple OSS Distributions for (int i = 0; i < 3; i++) {
348*0f4c859eSApple OSS Distributions /* Associate thread to eventlink objects */
349*0f4c859eSApple OSS Distributions kr = mach_eventlink_associate(port_pair[0], self, 0, 0, 0, 0, MELA_OPTION_NONE);
350*0f4c859eSApple OSS Distributions T_ASSERT_MACH_SUCCESS(kr, "mach_eventlink_associate for object 1");
351*0f4c859eSApple OSS Distributions
352*0f4c859eSApple OSS Distributions kr = mach_eventlink_associate(port_pair[1], other_thread, 0, 0, 0, 0, MELA_OPTION_NONE);
353*0f4c859eSApple OSS Distributions T_ASSERT_MACH_SUCCESS(kr, "mach_eventlink_associate for object 2");
354*0f4c859eSApple OSS Distributions
355*0f4c859eSApple OSS Distributions /* Try to associate again with diff threads, expect failure */
356*0f4c859eSApple OSS Distributions kr = mach_eventlink_associate(port_pair[0], other_thread, 0, 0, 0, 0, MELA_OPTION_NONE);
357*0f4c859eSApple OSS Distributions T_EXPECT_MACH_ERROR(kr, KERN_NAME_EXISTS, "mach_eventlink_associate for associated "
358*0f4c859eSApple OSS Distributions "objects returned expected error");
359*0f4c859eSApple OSS Distributions
360*0f4c859eSApple OSS Distributions kr = mach_eventlink_associate(port_pair[1], self, 0, 0, 0, 0, MELA_OPTION_NONE);
361*0f4c859eSApple OSS Distributions T_EXPECT_MACH_ERROR(kr, KERN_NAME_EXISTS, "mach_eventlink_associate for associated "
362*0f4c859eSApple OSS Distributions "objects return expected error");
363*0f4c859eSApple OSS Distributions
364*0f4c859eSApple OSS Distributions /* Try to disassociate the threads */
365*0f4c859eSApple OSS Distributions kr = mach_eventlink_disassociate(port_pair[0], MELD_OPTION_NONE);
366*0f4c859eSApple OSS Distributions T_ASSERT_MACH_SUCCESS(kr, "mach_eventlink_disassociate for object 1");
367*0f4c859eSApple OSS Distributions
368*0f4c859eSApple OSS Distributions kr = mach_eventlink_disassociate(port_pair[1], MELD_OPTION_NONE);
369*0f4c859eSApple OSS Distributions T_ASSERT_MACH_SUCCESS(kr, "mach_eventlink_disassociate for object 2");
370*0f4c859eSApple OSS Distributions
371*0f4c859eSApple OSS Distributions /* Try to disassociate the threads again, expect failure */
372*0f4c859eSApple OSS Distributions kr = mach_eventlink_disassociate(port_pair[0], MELD_OPTION_NONE);
373*0f4c859eSApple OSS Distributions T_EXPECT_MACH_ERROR(kr, KERN_INVALID_ARGUMENT, "mach_eventlink_disassociate for "
374*0f4c859eSApple OSS Distributions "disassociated objects returned expected error");
375*0f4c859eSApple OSS Distributions
376*0f4c859eSApple OSS Distributions kr = mach_eventlink_disassociate(port_pair[1], MELD_OPTION_NONE);
377*0f4c859eSApple OSS Distributions T_EXPECT_MACH_ERROR(kr, KERN_INVALID_ARGUMENT, "mach_eventlink_disassociate for "
378*0f4c859eSApple OSS Distributions "disassociated objects returned expected error");
379*0f4c859eSApple OSS Distributions }
380*0f4c859eSApple OSS Distributions
381*0f4c859eSApple OSS Distributions kr = mach_eventlink_destroy(port_pair[0]);
382*0f4c859eSApple OSS Distributions T_ASSERT_MACH_SUCCESS(kr, "mach_eventlink_destroy");
383*0f4c859eSApple OSS Distributions
384*0f4c859eSApple OSS Distributions /* Try disassociate on other end of destoryed eventlink pair */
385*0f4c859eSApple OSS Distributions kr = mach_eventlink_disassociate(port_pair[1], MELD_OPTION_NONE);
386*0f4c859eSApple OSS Distributions T_EXPECT_MACH_ERROR(kr, KERN_TERMINATED, "mach_eventlink_disassociate for "
387*0f4c859eSApple OSS Distributions "terminated object returned expected error");
388*0f4c859eSApple OSS Distributions
389*0f4c859eSApple OSS Distributions kr = mach_eventlink_destroy(port_pair[1]);
390*0f4c859eSApple OSS Distributions T_ASSERT_MACH_SUCCESS(kr, "mach_eventlink_destroy");
391*0f4c859eSApple OSS Distributions }
392*0f4c859eSApple OSS Distributions
393*0f4c859eSApple OSS Distributions /*
394*0f4c859eSApple OSS Distributions * Test 4: Test eventlink wait with timeout.
395*0f4c859eSApple OSS Distributions *
396*0f4c859eSApple OSS Distributions * Create an eventlink object, associate threads and test eventlink wait with timeout.
397*0f4c859eSApple OSS Distributions */
398*0f4c859eSApple OSS Distributions T_DECL(test_eventlink_wait_timeout, "eventlink wait timeout test", T_META_ASROOT(YES))
399*0f4c859eSApple OSS Distributions {
400*0f4c859eSApple OSS Distributions kern_return_t kr;
401*0f4c859eSApple OSS Distributions mach_port_t port_pair[2];
402*0f4c859eSApple OSS Distributions pthread_t pthread;
403*0f4c859eSApple OSS Distributions
404*0f4c859eSApple OSS Distributions /* Create an eventlink and associate threads to it */
405*0f4c859eSApple OSS Distributions kr = test_eventlink_create(port_pair);
406*0f4c859eSApple OSS Distributions if (kr != KERN_SUCCESS) {
407*0f4c859eSApple OSS Distributions return;
408*0f4c859eSApple OSS Distributions }
409*0f4c859eSApple OSS Distributions
410*0f4c859eSApple OSS Distributions pthread = thread_create_for_test(test_eventlink_wait_with_timeout, (void *)(uintptr_t)port_pair[0]);
411*0f4c859eSApple OSS Distributions sleep(10);
412*0f4c859eSApple OSS Distributions
413*0f4c859eSApple OSS Distributions /* destroy the eventlink object, the wake status of thread will check if the test passsed or failed */
414*0f4c859eSApple OSS Distributions mach_port_deallocate(mach_task_self(), port_pair[0]);
415*0f4c859eSApple OSS Distributions mach_port_deallocate(mach_task_self(), port_pair[1]);
416*0f4c859eSApple OSS Distributions
417*0f4c859eSApple OSS Distributions pthread_join(pthread, NULL);
418*0f4c859eSApple OSS Distributions }
419*0f4c859eSApple OSS Distributions
420*0f4c859eSApple OSS Distributions /*
421*0f4c859eSApple OSS Distributions * Test 5: Test eventlink wait with no wait.
422*0f4c859eSApple OSS Distributions *
423*0f4c859eSApple OSS Distributions * Create an eventlink object, associate threads and test eventlink wait with no wait flag.
424*0f4c859eSApple OSS Distributions */
425*0f4c859eSApple OSS Distributions T_DECL(test_eventlink_wait_no_wait, "eventlink wait no wait test", T_META_ASROOT(YES))
426*0f4c859eSApple OSS Distributions {
427*0f4c859eSApple OSS Distributions kern_return_t kr;
428*0f4c859eSApple OSS Distributions mach_port_t port_pair[2];
429*0f4c859eSApple OSS Distributions pthread_t pthread;
430*0f4c859eSApple OSS Distributions
431*0f4c859eSApple OSS Distributions /* Create an eventlink and associate threads to it */
432*0f4c859eSApple OSS Distributions kr = test_eventlink_create(port_pair);
433*0f4c859eSApple OSS Distributions if (kr != KERN_SUCCESS) {
434*0f4c859eSApple OSS Distributions return;
435*0f4c859eSApple OSS Distributions }
436*0f4c859eSApple OSS Distributions
437*0f4c859eSApple OSS Distributions pthread = thread_create_for_test(test_eventlink_wait_no_wait, (void *)(uintptr_t)port_pair[0]);
438*0f4c859eSApple OSS Distributions pthread_join(pthread, NULL);
439*0f4c859eSApple OSS Distributions
440*0f4c859eSApple OSS Distributions mach_port_deallocate(mach_task_self(), port_pair[0]);
441*0f4c859eSApple OSS Distributions mach_port_deallocate(mach_task_self(), port_pair[1]);
442*0f4c859eSApple OSS Distributions }
443*0f4c859eSApple OSS Distributions
444*0f4c859eSApple OSS Distributions /*
445*0f4c859eSApple OSS Distributions * Test 6: Test eventlink wait and destroy.
446*0f4c859eSApple OSS Distributions *
447*0f4c859eSApple OSS Distributions * Create an eventlink object, associate threads and destroy the port.
448*0f4c859eSApple OSS Distributions */
449*0f4c859eSApple OSS Distributions T_DECL(test_eventlink_wait_and_destroy, "eventlink wait and destroy", T_META_ASROOT(YES))
450*0f4c859eSApple OSS Distributions {
451*0f4c859eSApple OSS Distributions kern_return_t kr;
452*0f4c859eSApple OSS Distributions mach_port_t port_pair[2];
453*0f4c859eSApple OSS Distributions pthread_t pthread;
454*0f4c859eSApple OSS Distributions
455*0f4c859eSApple OSS Distributions /* Create an eventlink and associate threads to it */
456*0f4c859eSApple OSS Distributions kr = test_eventlink_create(port_pair);
457*0f4c859eSApple OSS Distributions if (kr != KERN_SUCCESS) {
458*0f4c859eSApple OSS Distributions return;
459*0f4c859eSApple OSS Distributions }
460*0f4c859eSApple OSS Distributions
461*0f4c859eSApple OSS Distributions pthread = thread_create_for_test(test_eventlink_wait_destroy, (void *)(uintptr_t)port_pair[0]);
462*0f4c859eSApple OSS Distributions
463*0f4c859eSApple OSS Distributions sleep(5);
464*0f4c859eSApple OSS Distributions
465*0f4c859eSApple OSS Distributions /* Increase the send right count for port before destroy to make sure no sender does not fire on destroy */
466*0f4c859eSApple OSS Distributions kr = mach_port_mod_refs(mach_task_self(), port_pair[0], MACH_PORT_RIGHT_SEND, 2);
467*0f4c859eSApple OSS Distributions T_ASSERT_MACH_SUCCESS(kr, "mach_port_mod_refs");
468*0f4c859eSApple OSS Distributions
469*0f4c859eSApple OSS Distributions /* Destroy the port for thread to wakeup */
470*0f4c859eSApple OSS Distributions kr = mach_eventlink_destroy(port_pair[0]);
471*0f4c859eSApple OSS Distributions T_ASSERT_MACH_SUCCESS(kr, "mach_eventlink_destroy");
472*0f4c859eSApple OSS Distributions
473*0f4c859eSApple OSS Distributions pthread_join(pthread, NULL);
474*0f4c859eSApple OSS Distributions mach_port_deallocate(mach_task_self(), port_pair[1]);
475*0f4c859eSApple OSS Distributions }
476*0f4c859eSApple OSS Distributions
477*0f4c859eSApple OSS Distributions
478*0f4c859eSApple OSS Distributions /*
479*0f4c859eSApple OSS Distributions * Test 7: Test eventlink wait and destroy remote side.
480*0f4c859eSApple OSS Distributions *
481*0f4c859eSApple OSS Distributions * Create an eventlink object, associate threads, wait and destroy the remote eventlink port.
482*0f4c859eSApple OSS Distributions */
483*0f4c859eSApple OSS Distributions T_DECL(test_eventlink_wait_and_destroy_remote, "eventlink wait and remote destroy", T_META_ASROOT(YES))
484*0f4c859eSApple OSS Distributions {
485*0f4c859eSApple OSS Distributions kern_return_t kr;
486*0f4c859eSApple OSS Distributions mach_port_t port_pair[2];
487*0f4c859eSApple OSS Distributions pthread_t pthread;
488*0f4c859eSApple OSS Distributions
489*0f4c859eSApple OSS Distributions /* Create an eventlink and associate threads to it */
490*0f4c859eSApple OSS Distributions kr = test_eventlink_create(port_pair);
491*0f4c859eSApple OSS Distributions if (kr != KERN_SUCCESS) {
492*0f4c859eSApple OSS Distributions return;
493*0f4c859eSApple OSS Distributions }
494*0f4c859eSApple OSS Distributions
495*0f4c859eSApple OSS Distributions pthread = thread_create_for_test(test_eventlink_wait_destroy, (void *)(uintptr_t)port_pair[0]);
496*0f4c859eSApple OSS Distributions
497*0f4c859eSApple OSS Distributions sleep(5);
498*0f4c859eSApple OSS Distributions
499*0f4c859eSApple OSS Distributions /* Increase the send right count for port before destroy to make sure no sender does not fire on destroy */
500*0f4c859eSApple OSS Distributions kr = mach_port_mod_refs(mach_task_self(), port_pair[1], MACH_PORT_RIGHT_SEND, 2);
501*0f4c859eSApple OSS Distributions T_ASSERT_MACH_SUCCESS(kr, "mach_port_mod_refs");
502*0f4c859eSApple OSS Distributions
503*0f4c859eSApple OSS Distributions /* Destroy the port for thread to wakeup */
504*0f4c859eSApple OSS Distributions kr = mach_eventlink_destroy(port_pair[1]);
505*0f4c859eSApple OSS Distributions T_ASSERT_MACH_SUCCESS(kr, "mach_eventlink_destroy");
506*0f4c859eSApple OSS Distributions
507*0f4c859eSApple OSS Distributions pthread_join(pthread, NULL);
508*0f4c859eSApple OSS Distributions mach_port_deallocate(mach_task_self(), port_pair[0]);
509*0f4c859eSApple OSS Distributions }
510*0f4c859eSApple OSS Distributions
511*0f4c859eSApple OSS Distributions /*
512*0f4c859eSApple OSS Distributions * Test 8: Test eventlink wait and deallocate port.
513*0f4c859eSApple OSS Distributions *
514*0f4c859eSApple OSS Distributions * Create an eventlink object, associate threads, wait and deallocate the eventlink port.
515*0f4c859eSApple OSS Distributions */
516*0f4c859eSApple OSS Distributions T_DECL(test_eventlink_wait_and_deallocate, "eventlink wait and deallocate", T_META_ASROOT(YES))
517*0f4c859eSApple OSS Distributions {
518*0f4c859eSApple OSS Distributions kern_return_t kr;
519*0f4c859eSApple OSS Distributions mach_port_t port_pair[2];
520*0f4c859eSApple OSS Distributions pthread_t pthread;
521*0f4c859eSApple OSS Distributions
522*0f4c859eSApple OSS Distributions /* Create an eventlink and associate threads to it */
523*0f4c859eSApple OSS Distributions kr = test_eventlink_create(port_pair);
524*0f4c859eSApple OSS Distributions if (kr != KERN_SUCCESS) {
525*0f4c859eSApple OSS Distributions return;
526*0f4c859eSApple OSS Distributions }
527*0f4c859eSApple OSS Distributions
528*0f4c859eSApple OSS Distributions pthread = thread_create_for_test(test_eventlink_wait_destroy, (void *)(uintptr_t)port_pair[0]);
529*0f4c859eSApple OSS Distributions
530*0f4c859eSApple OSS Distributions sleep(5);
531*0f4c859eSApple OSS Distributions
532*0f4c859eSApple OSS Distributions /* Destroy the port for thread to wakeup */
533*0f4c859eSApple OSS Distributions mach_port_deallocate(mach_task_self(), port_pair[0]);
534*0f4c859eSApple OSS Distributions
535*0f4c859eSApple OSS Distributions pthread_join(pthread, NULL);
536*0f4c859eSApple OSS Distributions mach_port_deallocate(mach_task_self(), port_pair[1]);
537*0f4c859eSApple OSS Distributions }
538*0f4c859eSApple OSS Distributions
539*0f4c859eSApple OSS Distributions /*
540*0f4c859eSApple OSS Distributions * Test 9: Test eventlink wait and disassociate.
541*0f4c859eSApple OSS Distributions *
542*0f4c859eSApple OSS Distributions * Create an eventlink object, associate threads, wait and disassociate thread from the eventlink port.
543*0f4c859eSApple OSS Distributions */
544*0f4c859eSApple OSS Distributions T_DECL(test_eventlink_wait_and_disassociate, "eventlink wait and disassociate", T_META_ASROOT(YES))
545*0f4c859eSApple OSS Distributions {
546*0f4c859eSApple OSS Distributions kern_return_t kr;
547*0f4c859eSApple OSS Distributions mach_port_t port_pair[2];
548*0f4c859eSApple OSS Distributions pthread_t pthread;
549*0f4c859eSApple OSS Distributions
550*0f4c859eSApple OSS Distributions /* Create an eventlink and associate threads to it */
551*0f4c859eSApple OSS Distributions kr = test_eventlink_create(port_pair);
552*0f4c859eSApple OSS Distributions if (kr != KERN_SUCCESS) {
553*0f4c859eSApple OSS Distributions return;
554*0f4c859eSApple OSS Distributions }
555*0f4c859eSApple OSS Distributions
556*0f4c859eSApple OSS Distributions pthread = thread_create_for_test(test_eventlink_wait_destroy, (void *)(uintptr_t)port_pair[0]);
557*0f4c859eSApple OSS Distributions
558*0f4c859eSApple OSS Distributions sleep(5);
559*0f4c859eSApple OSS Distributions
560*0f4c859eSApple OSS Distributions /* Disassociate thread from eventlink for thread to wakeup */
561*0f4c859eSApple OSS Distributions kr = mach_eventlink_disassociate(port_pair[0], MELD_OPTION_NONE);
562*0f4c859eSApple OSS Distributions T_ASSERT_MACH_SUCCESS(kr, "mach_eventlink_disassociate");
563*0f4c859eSApple OSS Distributions
564*0f4c859eSApple OSS Distributions pthread_join(pthread, NULL);
565*0f4c859eSApple OSS Distributions mach_port_deallocate(mach_task_self(), port_pair[1]);
566*0f4c859eSApple OSS Distributions mach_port_deallocate(mach_task_self(), port_pair[0]);
567*0f4c859eSApple OSS Distributions }
568*0f4c859eSApple OSS Distributions
569*0f4c859eSApple OSS Distributions /*
570*0f4c859eSApple OSS Distributions * Test 10: Test eventlink wait and signal.
571*0f4c859eSApple OSS Distributions *
572*0f4c859eSApple OSS Distributions * Create an eventlink object, associate threads and test wait signal.
573*0f4c859eSApple OSS Distributions */
574*0f4c859eSApple OSS Distributions T_DECL(test_eventlink_wait_and_signal, "eventlink wait and signal", T_META_ASROOT(YES))
575*0f4c859eSApple OSS Distributions {
576*0f4c859eSApple OSS Distributions kern_return_t kr;
577*0f4c859eSApple OSS Distributions mach_port_t port_pair[2];
578*0f4c859eSApple OSS Distributions pthread_t pthread;
579*0f4c859eSApple OSS Distributions mach_port_t self = mach_thread_self();
580*0f4c859eSApple OSS Distributions
581*0f4c859eSApple OSS Distributions /* Create an eventlink and associate threads to it */
582*0f4c859eSApple OSS Distributions kr = test_eventlink_create(port_pair);
583*0f4c859eSApple OSS Distributions if (kr != KERN_SUCCESS) {
584*0f4c859eSApple OSS Distributions return;
585*0f4c859eSApple OSS Distributions }
586*0f4c859eSApple OSS Distributions
587*0f4c859eSApple OSS Distributions pthread = thread_create_for_test(test_eventlink_wait_for_signal, (void *)(uintptr_t)port_pair[0]);
588*0f4c859eSApple OSS Distributions
589*0f4c859eSApple OSS Distributions sleep(5);
590*0f4c859eSApple OSS Distributions
591*0f4c859eSApple OSS Distributions /* Associate thread and signal the eventlink */
592*0f4c859eSApple OSS Distributions kr = mach_eventlink_associate(port_pair[1], self, 0, 0, 0, 0, MELA_OPTION_NONE);
593*0f4c859eSApple OSS Distributions T_ASSERT_MACH_SUCCESS(kr, "mach_eventlink_associate for object 2");
594*0f4c859eSApple OSS Distributions
595*0f4c859eSApple OSS Distributions kr = mach_eventlink_signal(port_pair[1], 0);
596*0f4c859eSApple OSS Distributions T_ASSERT_MACH_SUCCESS(kr, "mach_eventlink_signal for object 2");
597*0f4c859eSApple OSS Distributions
598*0f4c859eSApple OSS Distributions pthread_join(pthread, NULL);
599*0f4c859eSApple OSS Distributions
600*0f4c859eSApple OSS Distributions mach_port_deallocate(mach_task_self(), port_pair[0]);
601*0f4c859eSApple OSS Distributions mach_port_deallocate(mach_task_self(), port_pair[1]);
602*0f4c859eSApple OSS Distributions }
603*0f4c859eSApple OSS Distributions
604*0f4c859eSApple OSS Distributions /*
605*0f4c859eSApple OSS Distributions * Test 11: Test eventlink wait_signal.
606*0f4c859eSApple OSS Distributions *
607*0f4c859eSApple OSS Distributions * Create an eventlink object, associate threads and test wait_signal.
608*0f4c859eSApple OSS Distributions */
609*0f4c859eSApple OSS Distributions T_DECL(test_eventlink_wait_signal, "eventlink wait_signal", T_META_ASROOT(YES))
610*0f4c859eSApple OSS Distributions {
611*0f4c859eSApple OSS Distributions kern_return_t kr;
612*0f4c859eSApple OSS Distributions mach_port_t port_pair[2];
613*0f4c859eSApple OSS Distributions pthread_t pthread;
614*0f4c859eSApple OSS Distributions mach_port_t self = mach_thread_self();
615*0f4c859eSApple OSS Distributions uint64_t count = 0;
616*0f4c859eSApple OSS Distributions
617*0f4c859eSApple OSS Distributions /* Create an eventlink and associate threads to it */
618*0f4c859eSApple OSS Distributions kr = test_eventlink_create(port_pair);
619*0f4c859eSApple OSS Distributions if (kr != KERN_SUCCESS) {
620*0f4c859eSApple OSS Distributions return;
621*0f4c859eSApple OSS Distributions }
622*0f4c859eSApple OSS Distributions
623*0f4c859eSApple OSS Distributions pthread = thread_create_for_test(test_eventlink_wait_then_signal, (void *)(uintptr_t)port_pair[0]);
624*0f4c859eSApple OSS Distributions
625*0f4c859eSApple OSS Distributions sleep(5);
626*0f4c859eSApple OSS Distributions
627*0f4c859eSApple OSS Distributions /* Associate thread and wait_signal the eventlink */
628*0f4c859eSApple OSS Distributions kr = mach_eventlink_associate(port_pair[1], self, 0, 0, 0, 0, MELA_OPTION_NONE);
629*0f4c859eSApple OSS Distributions T_ASSERT_MACH_SUCCESS(kr, "mach_eventlink_associate for object 2");
630*0f4c859eSApple OSS Distributions
631*0f4c859eSApple OSS Distributions /* Wait on the eventlink with timeout */
632*0f4c859eSApple OSS Distributions kr = mach_eventlink_signal_wait_until(port_pair[1], &count, 0, MELSW_OPTION_NONE,
633*0f4c859eSApple OSS Distributions KERN_CLOCK_MACH_ABSOLUTE_TIME, 0);
634*0f4c859eSApple OSS Distributions
635*0f4c859eSApple OSS Distributions T_ASSERT_MACH_SUCCESS(kr, "mach_eventlink_signal_wait_until");
636*0f4c859eSApple OSS Distributions T_EXPECT_EQ(count, (uint64_t)1, "mach_eventlink_signal_wait_until returned correct count value");
637*0f4c859eSApple OSS Distributions
638*0f4c859eSApple OSS Distributions pthread_join(pthread, NULL);
639*0f4c859eSApple OSS Distributions
640*0f4c859eSApple OSS Distributions mach_port_deallocate(mach_task_self(), port_pair[0]);
641*0f4c859eSApple OSS Distributions mach_port_deallocate(mach_task_self(), port_pair[1]);
642*0f4c859eSApple OSS Distributions }
643*0f4c859eSApple OSS Distributions
644*0f4c859eSApple OSS Distributions /*
645*0f4c859eSApple OSS Distributions * Test 12: Test eventlink wait_signal with no wait.
646*0f4c859eSApple OSS Distributions *
647*0f4c859eSApple OSS Distributions * Create an eventlink object, associate threads and test wait_signal with no wait.
648*0f4c859eSApple OSS Distributions */
649*0f4c859eSApple OSS Distributions T_DECL(test_eventlink_wait_signal_no_wait, "eventlink wait_signal with no wait", T_META_ASROOT(YES))
650*0f4c859eSApple OSS Distributions {
651*0f4c859eSApple OSS Distributions kern_return_t kr;
652*0f4c859eSApple OSS Distributions mach_port_t port_pair[2];
653*0f4c859eSApple OSS Distributions pthread_t pthread;
654*0f4c859eSApple OSS Distributions mach_port_t self = mach_thread_self();
655*0f4c859eSApple OSS Distributions uint64_t count = 0;
656*0f4c859eSApple OSS Distributions
657*0f4c859eSApple OSS Distributions /* Create an eventlink and associate threads to it */
658*0f4c859eSApple OSS Distributions kr = test_eventlink_create(port_pair);
659*0f4c859eSApple OSS Distributions if (kr != KERN_SUCCESS) {
660*0f4c859eSApple OSS Distributions return;
661*0f4c859eSApple OSS Distributions }
662*0f4c859eSApple OSS Distributions
663*0f4c859eSApple OSS Distributions pthread = thread_create_for_test(test_eventlink_wait_then_wait_signal_with_no_wait, (void *)(uintptr_t)port_pair[0]);
664*0f4c859eSApple OSS Distributions
665*0f4c859eSApple OSS Distributions sleep(5);
666*0f4c859eSApple OSS Distributions
667*0f4c859eSApple OSS Distributions /* Associate thread and wait_signal the eventlink */
668*0f4c859eSApple OSS Distributions kr = mach_eventlink_associate(port_pair[1], self, 0, 0, 0, 0, MELA_OPTION_NONE);
669*0f4c859eSApple OSS Distributions T_ASSERT_MACH_SUCCESS(kr, "mach_eventlink_associate for object 2");
670*0f4c859eSApple OSS Distributions
671*0f4c859eSApple OSS Distributions /* Wait on the eventlink with timeout */
672*0f4c859eSApple OSS Distributions kr = mach_eventlink_signal_wait_until(port_pair[1], &count, 0, MELSW_OPTION_NONE,
673*0f4c859eSApple OSS Distributions KERN_CLOCK_MACH_ABSOLUTE_TIME, 0);
674*0f4c859eSApple OSS Distributions
675*0f4c859eSApple OSS Distributions T_ASSERT_MACH_SUCCESS(kr, "mach_eventlink_signal_wait_until");
676*0f4c859eSApple OSS Distributions T_EXPECT_EQ(count, (uint64_t)1, "mach_eventlink_signal_wait_until returned correct count value");
677*0f4c859eSApple OSS Distributions
678*0f4c859eSApple OSS Distributions pthread_join(pthread, NULL);
679*0f4c859eSApple OSS Distributions
680*0f4c859eSApple OSS Distributions mach_port_deallocate(mach_task_self(), port_pair[0]);
681*0f4c859eSApple OSS Distributions mach_port_deallocate(mach_task_self(), port_pair[1]);
682*0f4c859eSApple OSS Distributions }
683*0f4c859eSApple OSS Distributions
684*0f4c859eSApple OSS Distributions /*
685*0f4c859eSApple OSS Distributions * Test 13: Test eventlink wait_signal with prepost.
686*0f4c859eSApple OSS Distributions *
687*0f4c859eSApple OSS Distributions * Create an eventlink object, associate threads and test wait_signal with prepost.
688*0f4c859eSApple OSS Distributions */
689*0f4c859eSApple OSS Distributions T_DECL(test_eventlink_wait_signal_prepost, "eventlink wait_signal with prepost", T_META_ASROOT(YES))
690*0f4c859eSApple OSS Distributions {
691*0f4c859eSApple OSS Distributions kern_return_t kr;
692*0f4c859eSApple OSS Distributions mach_port_t port_pair[2];
693*0f4c859eSApple OSS Distributions pthread_t pthread;
694*0f4c859eSApple OSS Distributions mach_port_t self = mach_thread_self();
695*0f4c859eSApple OSS Distributions uint64_t count = 0;
696*0f4c859eSApple OSS Distributions
697*0f4c859eSApple OSS Distributions /* Create an eventlink and associate threads to it */
698*0f4c859eSApple OSS Distributions kr = test_eventlink_create(port_pair);
699*0f4c859eSApple OSS Distributions if (kr != KERN_SUCCESS) {
700*0f4c859eSApple OSS Distributions return;
701*0f4c859eSApple OSS Distributions }
702*0f4c859eSApple OSS Distributions
703*0f4c859eSApple OSS Distributions pthread = thread_create_for_test(test_eventlink_wait_then_wait_signal_with_prepost, (void *)(uintptr_t)port_pair[0]);
704*0f4c859eSApple OSS Distributions
705*0f4c859eSApple OSS Distributions sleep(5);
706*0f4c859eSApple OSS Distributions
707*0f4c859eSApple OSS Distributions /* Associate thread and wait_signal the eventlink */
708*0f4c859eSApple OSS Distributions kr = mach_eventlink_associate(port_pair[1], self, 0, 0, 0, 0, MELA_OPTION_NONE);
709*0f4c859eSApple OSS Distributions T_ASSERT_MACH_SUCCESS(kr, "mach_eventlink_associate for object 2");
710*0f4c859eSApple OSS Distributions
711*0f4c859eSApple OSS Distributions /* Wait on the eventlink with timeout */
712*0f4c859eSApple OSS Distributions kr = mach_eventlink_signal_wait_until(port_pair[1], &count, 0, MELSW_OPTION_NONE,
713*0f4c859eSApple OSS Distributions KERN_CLOCK_MACH_ABSOLUTE_TIME, 0);
714*0f4c859eSApple OSS Distributions
715*0f4c859eSApple OSS Distributions T_ASSERT_MACH_SUCCESS(kr, "mach_eventlink_signal_wait_until");
716*0f4c859eSApple OSS Distributions T_EXPECT_EQ(count, (uint64_t)1, "mach_eventlink_signal_wait_until returned correct count value");
717*0f4c859eSApple OSS Distributions
718*0f4c859eSApple OSS Distributions pthread_join(pthread, NULL);
719*0f4c859eSApple OSS Distributions
720*0f4c859eSApple OSS Distributions mach_port_deallocate(mach_task_self(), port_pair[0]);
721*0f4c859eSApple OSS Distributions mach_port_deallocate(mach_task_self(), port_pair[1]);
722*0f4c859eSApple OSS Distributions }
723*0f4c859eSApple OSS Distributions
724*0f4c859eSApple OSS Distributions /*
725*0f4c859eSApple OSS Distributions * Test 14: Test eventlink wait_signal with associate on wait option.
726*0f4c859eSApple OSS Distributions *
727*0f4c859eSApple OSS Distributions * Create an eventlink object, set associate on wait on one side and test wait_signal.
728*0f4c859eSApple OSS Distributions */
729*0f4c859eSApple OSS Distributions T_DECL(test_eventlink_wait_signal_associate_on_wait, "eventlink wait_signal associate on wait", T_META_ASROOT(YES))
730*0f4c859eSApple OSS Distributions {
731*0f4c859eSApple OSS Distributions kern_return_t kr;
732*0f4c859eSApple OSS Distributions mach_port_t port_pair[2];
733*0f4c859eSApple OSS Distributions pthread_t pthread;
734*0f4c859eSApple OSS Distributions uint64_t count = 0;
735*0f4c859eSApple OSS Distributions
736*0f4c859eSApple OSS Distributions /* Create an eventlink and associate threads to it */
737*0f4c859eSApple OSS Distributions kr = test_eventlink_create(port_pair);
738*0f4c859eSApple OSS Distributions if (kr != KERN_SUCCESS) {
739*0f4c859eSApple OSS Distributions return;
740*0f4c859eSApple OSS Distributions }
741*0f4c859eSApple OSS Distributions
742*0f4c859eSApple OSS Distributions pthread = thread_create_for_test(test_eventlink_wait_then_signal, (void *)(uintptr_t)port_pair[0]);
743*0f4c859eSApple OSS Distributions
744*0f4c859eSApple OSS Distributions sleep(5);
745*0f4c859eSApple OSS Distributions
746*0f4c859eSApple OSS Distributions /* Set associate on wait and wait_signal the eventlink */
747*0f4c859eSApple OSS Distributions kr = mach_eventlink_associate(port_pair[1], MACH_PORT_NULL, 0, 0, 0, 0, MELA_OPTION_ASSOCIATE_ON_WAIT);
748*0f4c859eSApple OSS Distributions T_ASSERT_MACH_SUCCESS(kr, "mach_eventlink_associate with associate on wait for object 2");
749*0f4c859eSApple OSS Distributions
750*0f4c859eSApple OSS Distributions /* Wait on the eventlink with timeout */
751*0f4c859eSApple OSS Distributions kr = mach_eventlink_signal_wait_until(port_pair[1], &count, 0, MELSW_OPTION_NONE,
752*0f4c859eSApple OSS Distributions KERN_CLOCK_MACH_ABSOLUTE_TIME, 0);
753*0f4c859eSApple OSS Distributions
754*0f4c859eSApple OSS Distributions T_ASSERT_MACH_SUCCESS(kr, "mach_eventlink_signal_wait_until");
755*0f4c859eSApple OSS Distributions T_EXPECT_EQ(count, (uint64_t)1, "mach_eventlink_signal_wait_until returned correct count value");
756*0f4c859eSApple OSS Distributions
757*0f4c859eSApple OSS Distributions /* Remove associate on wait option */
758*0f4c859eSApple OSS Distributions kr = mach_eventlink_disassociate(port_pair[1], MELD_OPTION_NONE);
759*0f4c859eSApple OSS Distributions T_ASSERT_MACH_SUCCESS(kr, "mach_eventlink_disassociate");
760*0f4c859eSApple OSS Distributions
761*0f4c859eSApple OSS Distributions /* Wait on the eventlink with timeout */
762*0f4c859eSApple OSS Distributions kr = mach_eventlink_signal_wait_until(port_pair[1], &count, 0, MELSW_OPTION_NONE,
763*0f4c859eSApple OSS Distributions KERN_CLOCK_MACH_ABSOLUTE_TIME, 0);
764*0f4c859eSApple OSS Distributions
765*0f4c859eSApple OSS Distributions T_EXPECT_MACH_ERROR(kr, KERN_INVALID_ARGUMENT, "mach_eventlink_wait_until returned expected error");
766*0f4c859eSApple OSS Distributions
767*0f4c859eSApple OSS Distributions pthread_join(pthread, NULL);
768*0f4c859eSApple OSS Distributions
769*0f4c859eSApple OSS Distributions mach_port_deallocate(mach_task_self(), port_pair[0]);
770*0f4c859eSApple OSS Distributions mach_port_deallocate(mach_task_self(), port_pair[1]);
771*0f4c859eSApple OSS Distributions }
772*0f4c859eSApple OSS Distributions
773*0f4c859eSApple OSS Distributions /*
774*0f4c859eSApple OSS Distributions * Test 15: Test eventlink wait_signal_loop.
775*0f4c859eSApple OSS Distributions *
776*0f4c859eSApple OSS Distributions * Create an eventlink object, associate threads and test wait_signal in a loop.
777*0f4c859eSApple OSS Distributions */
778*0f4c859eSApple OSS Distributions T_DECL(test_eventlink_wait_signal_loop, "eventlink wait_signal in loop", T_META_ASROOT(YES))
779*0f4c859eSApple OSS Distributions {
780*0f4c859eSApple OSS Distributions kern_return_t kr;
781*0f4c859eSApple OSS Distributions mach_port_t port_pair[2];
782*0f4c859eSApple OSS Distributions pthread_t pthread;
783*0f4c859eSApple OSS Distributions mach_port_t self = mach_thread_self();
784*0f4c859eSApple OSS Distributions uint64_t count = 0;
785*0f4c859eSApple OSS Distributions int i;
786*0f4c859eSApple OSS Distributions
787*0f4c859eSApple OSS Distributions /* Create an eventlink and associate threads to it */
788*0f4c859eSApple OSS Distributions kr = test_eventlink_create(port_pair);
789*0f4c859eSApple OSS Distributions if (kr != KERN_SUCCESS) {
790*0f4c859eSApple OSS Distributions return;
791*0f4c859eSApple OSS Distributions }
792*0f4c859eSApple OSS Distributions
793*0f4c859eSApple OSS Distributions pthread = thread_create_for_test(test_eventlink_wait_then_signal_loop, (void *)(uintptr_t)port_pair[0]);
794*0f4c859eSApple OSS Distributions
795*0f4c859eSApple OSS Distributions /* Associate thread and wait_signal the eventlink */
796*0f4c859eSApple OSS Distributions kr = mach_eventlink_associate(port_pair[1], self, 0, 0, 0, 0, MELA_OPTION_NONE);
797*0f4c859eSApple OSS Distributions T_ASSERT_MACH_SUCCESS(kr, "mach_eventlink_associate for object 2");
798*0f4c859eSApple OSS Distributions
799*0f4c859eSApple OSS Distributions for (i = 0; i < 100; i++) {
800*0f4c859eSApple OSS Distributions /* Wait on the eventlink with timeout */
801*0f4c859eSApple OSS Distributions kr = mach_eventlink_signal_wait_until(port_pair[1], &count, 0, MELSW_OPTION_NONE,
802*0f4c859eSApple OSS Distributions KERN_CLOCK_MACH_ABSOLUTE_TIME, 0);
803*0f4c859eSApple OSS Distributions
804*0f4c859eSApple OSS Distributions T_ASSERT_MACH_SUCCESS(kr, "main thread: mach_eventlink_signal_wait_until");
805*0f4c859eSApple OSS Distributions T_EXPECT_EQ(count, (uint64_t)(i + 1), "main thread: mach_eventlink_signal_wait_until returned correct count value");
806*0f4c859eSApple OSS Distributions }
807*0f4c859eSApple OSS Distributions
808*0f4c859eSApple OSS Distributions pthread_join(pthread, NULL);
809*0f4c859eSApple OSS Distributions
810*0f4c859eSApple OSS Distributions mach_port_deallocate(mach_task_self(), port_pair[0]);
811*0f4c859eSApple OSS Distributions mach_port_deallocate(mach_task_self(), port_pair[1]);
812*0f4c859eSApple OSS Distributions }
813