6 #include <mach/mk_timer.h>
8 #include <darwintest.h>
10 T_DECL(mktimer_kobject
, "mktimer_kobject()", T_META_ALL_VALID_ARCHS(true))
12 mach_port_t timer_port
= MACH_PORT_NULL
;
13 mach_port_t notify_port
= MACH_PORT_NULL
;
15 kern_return_t kr
= KERN_SUCCESS
;
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
));
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
));
25 // notification port for the mk_timer port to come back on
26 kr
= mach_port_allocate(mach_task_self(), MACH_PORT_RIGHT_RECEIVE
, ¬ify_port
);
27 T_ASSERT_EQ(kr
, KERN_SUCCESS
, "mach_port_allocate(notify_port): %s", mach_error_string(kr
));
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
));
32 T_LOG("timer: 0x%x, notify: 0x%x", timer_port
, notify_port
);
34 mach_port_t previous
= MACH_PORT_NULL
;
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
);
40 T_ASSERT_NE(kr
, KERN_SUCCESS
, "notifications should NOT work on mk_timer ports!");
42 // destroy the timer port to send the notification
43 mach_port_mod_refs(mach_task_self(), timer_port
, MACH_PORT_RIGHT_RECEIVE
, -1);
45 // destroy the notification port
46 mach_port_mod_refs(mach_task_self(), notify_port
, MACH_PORT_RIGHT_RECEIVE
, -1);