]> git.saurik.com Git - apple/xnu.git/blob - tools/tests/darwintests/mktimer_kobject.c
xnu-4570.61.1.tar.gz
[apple/xnu.git] / tools / tests / darwintests / mktimer_kobject.c
1 #include <stdint.h>
2 #include <stdio.h>
3 #include <unistd.h>
4
5 #include <mach/mach.h>
6 #include <mach/mk_timer.h>
7
8 #include <darwintest.h>
9
10 T_DECL(mktimer_kobject, "mktimer_kobject()", T_META_ALL_VALID_ARCHS(true))
11 {
12 mach_port_t timer_port = MACH_PORT_NULL;
13 mach_port_t notify_port = MACH_PORT_NULL;
14
15 kern_return_t kr = KERN_SUCCESS;
16
17 // timer port
18 // This is a receive right which is also a kobject
19 timer_port = mk_timer_create();
20 T_ASSERT_NE(timer_port, (mach_port_t)MACH_PORT_NULL, "mk_timer_create: %s", mach_error_string(kr));
21
22 mach_port_set_context(mach_task_self(), timer_port, (mach_port_context_t) 0x1);
23 T_ASSERT_EQ(kr, KERN_SUCCESS, "mach_port_set_context(timer_port): %s", mach_error_string(kr));
24
25 // notification port for the mk_timer port to come back on
26 kr = mach_port_allocate(mach_task_self(), MACH_PORT_RIGHT_RECEIVE, &notify_port);
27 T_ASSERT_EQ(kr, KERN_SUCCESS, "mach_port_allocate(notify_port): %s", mach_error_string(kr));
28
29 kr = mach_port_set_context(mach_task_self(), notify_port, (mach_port_context_t) 0x2);
30 T_ASSERT_EQ(kr, KERN_SUCCESS, "mach_port_set_context(notify_port): %s", mach_error_string(kr));
31
32 T_LOG("timer: 0x%x, notify: 0x%x", timer_port, notify_port);
33
34 mach_port_t previous = MACH_PORT_NULL;
35
36 // request a port-destroyed notification on the timer port
37 kr = mach_port_request_notification(mach_task_self(), timer_port, MACH_NOTIFY_PORT_DESTROYED,
38 0, notify_port, MACH_MSG_TYPE_MAKE_SEND_ONCE, &previous);
39 // this should fail!
40 T_ASSERT_NE(kr, KERN_SUCCESS, "notifications should NOT work on mk_timer ports!");
41
42 // destroy the timer port to send the notification
43 mach_port_mod_refs(mach_task_self(), timer_port, MACH_PORT_RIGHT_RECEIVE, -1);
44
45 // destroy the notification port
46 mach_port_mod_refs(mach_task_self(), notify_port, MACH_PORT_RIGHT_RECEIVE, -1);
47
48 T_LOG("done");
49 }
50