1 #include <darwintest.h> 2 #include <mach/thread_policy_private.h> 3 #include <mach/mach.h> 4 #include <dispatch/dispatch.h> 5 6 static qos_class_t thread_qos_to_qos_class(uint32_t thread_qos)7thread_qos_to_qos_class(uint32_t thread_qos) 8 { 9 switch (thread_qos) { 10 case THREAD_QOS_MAINTENANCE: 11 return QOS_CLASS_MAINTENANCE; 12 case THREAD_QOS_BACKGROUND: 13 return QOS_CLASS_BACKGROUND; 14 case THREAD_QOS_UTILITY: 15 return QOS_CLASS_UTILITY; 16 case THREAD_QOS_LEGACY: 17 return QOS_CLASS_DEFAULT; 18 case THREAD_QOS_USER_INITIATED: 19 return QOS_CLASS_USER_INITIATED; 20 case THREAD_QOS_USER_INTERACTIVE: 21 return QOS_CLASS_USER_INTERACTIVE; 22 default: 23 return QOS_CLASS_UNSPECIFIED; 24 } 25 } 26 27 static qos_class_t get_thread_requested_qos(void)28get_thread_requested_qos(void) 29 { 30 mach_msg_type_number_t count = THREAD_REQUESTED_STATE_POLICY_COUNT; 31 struct thread_requested_qos_policy requested_policy; 32 boolean_t get_default = FALSE; 33 mach_port_t thread_port = pthread_mach_thread_np(pthread_self()); 34 35 kern_return_t kr = thread_policy_get(thread_port, THREAD_REQUESTED_STATE_POLICY, 36 (thread_policy_t)&requested_policy, &count, &get_default); 37 T_QUIET; T_ASSERT_MACH_SUCCESS(kr, "thread_policy_get"); 38 39 return thread_qos_to_qos_class(requested_policy.thrq_base_qos); 40 } 41 42 T_DECL(thread_policy_requested_state, "THREAD_REQUESTED_STATE_POLICY", T_META_ASROOT(NO)) 43 { 44 qos_class_t main_thread_qos = get_thread_requested_qos(); 45 T_ASSERT_EQ(main_thread_qos, qos_class_main(), "main thead requested qos matches"); 46 } 47