1*4d495c6eSApple OSS Distributions /* 2*4d495c6eSApple OSS Distributions * Copyright (c) 2000-2007 Apple Inc. All rights reserved. 3*4d495c6eSApple OSS Distributions * 4*4d495c6eSApple OSS Distributions * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ 5*4d495c6eSApple OSS Distributions * 6*4d495c6eSApple OSS Distributions * This file contains Original Code and/or Modifications of Original Code 7*4d495c6eSApple OSS Distributions * as defined in and that are subject to the Apple Public Source License 8*4d495c6eSApple OSS Distributions * Version 2.0 (the 'License'). You may not use this file except in 9*4d495c6eSApple OSS Distributions * compliance with the License. The rights granted to you under the License 10*4d495c6eSApple OSS Distributions * may not be used to create, or enable the creation or redistribution of, 11*4d495c6eSApple OSS Distributions * unlawful or unlicensed copies of an Apple operating system, or to 12*4d495c6eSApple OSS Distributions * circumvent, violate, or enable the circumvention or violation of, any 13*4d495c6eSApple OSS Distributions * terms of an Apple operating system software license agreement. 14*4d495c6eSApple OSS Distributions * 15*4d495c6eSApple OSS Distributions * Please obtain a copy of the License at 16*4d495c6eSApple OSS Distributions * http://www.opensource.apple.com/apsl/ and read it before using this file. 17*4d495c6eSApple OSS Distributions * 18*4d495c6eSApple OSS Distributions * The Original Code and all software distributed under the License are 19*4d495c6eSApple OSS Distributions * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER 20*4d495c6eSApple OSS Distributions * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, 21*4d495c6eSApple OSS Distributions * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, 22*4d495c6eSApple OSS Distributions * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. 23*4d495c6eSApple OSS Distributions * Please see the License for the specific language governing rights and 24*4d495c6eSApple OSS Distributions * limitations under the License. 25*4d495c6eSApple OSS Distributions * 26*4d495c6eSApple OSS Distributions * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ 27*4d495c6eSApple OSS Distributions */ 28*4d495c6eSApple OSS Distributions 29*4d495c6eSApple OSS Distributions #ifndef _MACH_THREAD_POLICY_H_ 30*4d495c6eSApple OSS Distributions #define _MACH_THREAD_POLICY_H_ 31*4d495c6eSApple OSS Distributions 32*4d495c6eSApple OSS Distributions #include <mach/mach_types.h> 33*4d495c6eSApple OSS Distributions 34*4d495c6eSApple OSS Distributions /* 35*4d495c6eSApple OSS Distributions * These are the calls for accessing the policy parameters 36*4d495c6eSApple OSS Distributions * of a particular thread. 37*4d495c6eSApple OSS Distributions * 38*4d495c6eSApple OSS Distributions * The extra 'get_default' parameter to the second call is 39*4d495c6eSApple OSS Distributions * IN/OUT as follows: 40*4d495c6eSApple OSS Distributions * 1) if asserted on the way in it indicates that the default 41*4d495c6eSApple OSS Distributions * values should be returned, not the ones currently set, in 42*4d495c6eSApple OSS Distributions * this case 'get_default' will always be asserted on return; 43*4d495c6eSApple OSS Distributions * 2) if unasserted on the way in, the current settings are 44*4d495c6eSApple OSS Distributions * desired and if still unasserted on return, then the info 45*4d495c6eSApple OSS Distributions * returned reflects the current settings, otherwise if 46*4d495c6eSApple OSS Distributions * 'get_default' returns asserted, it means that there are no 47*4d495c6eSApple OSS Distributions * current settings due to other parameters taking precedence, 48*4d495c6eSApple OSS Distributions * and the default ones are being returned instead. 49*4d495c6eSApple OSS Distributions */ 50*4d495c6eSApple OSS Distributions 51*4d495c6eSApple OSS Distributions typedef natural_t thread_policy_flavor_t; 52*4d495c6eSApple OSS Distributions typedef integer_t *thread_policy_t; 53*4d495c6eSApple OSS Distributions 54*4d495c6eSApple OSS Distributions /* 55*4d495c6eSApple OSS Distributions * kern_return_t thread_policy_set( 56*4d495c6eSApple OSS Distributions * thread_t thread, 57*4d495c6eSApple OSS Distributions * thread_policy_flavor_t flavor, 58*4d495c6eSApple OSS Distributions * thread_policy_t policy_info, 59*4d495c6eSApple OSS Distributions * mach_msg_type_number_t count); 60*4d495c6eSApple OSS Distributions * 61*4d495c6eSApple OSS Distributions * kern_return_t thread_policy_get( 62*4d495c6eSApple OSS Distributions * thread_t thread, 63*4d495c6eSApple OSS Distributions * thread_policy_flavor_t flavor, 64*4d495c6eSApple OSS Distributions * thread_policy_t policy_info, 65*4d495c6eSApple OSS Distributions * mach_msg_type_number_t *count, 66*4d495c6eSApple OSS Distributions * boolean_t *get_default); 67*4d495c6eSApple OSS Distributions */ 68*4d495c6eSApple OSS Distributions 69*4d495c6eSApple OSS Distributions /* 70*4d495c6eSApple OSS Distributions * Defined flavors. 71*4d495c6eSApple OSS Distributions */ 72*4d495c6eSApple OSS Distributions /* 73*4d495c6eSApple OSS Distributions * THREAD_STANDARD_POLICY: 74*4d495c6eSApple OSS Distributions * 75*4d495c6eSApple OSS Distributions * This is the standard (fair) scheduling mode, assigned to new 76*4d495c6eSApple OSS Distributions * threads. The thread will be given processor time in a manner 77*4d495c6eSApple OSS Distributions * which apportions approximately equal share to long running 78*4d495c6eSApple OSS Distributions * computations. 79*4d495c6eSApple OSS Distributions * 80*4d495c6eSApple OSS Distributions * Parameters: 81*4d495c6eSApple OSS Distributions * [none] 82*4d495c6eSApple OSS Distributions */ 83*4d495c6eSApple OSS Distributions 84*4d495c6eSApple OSS Distributions #define THREAD_STANDARD_POLICY 1 85*4d495c6eSApple OSS Distributions 86*4d495c6eSApple OSS Distributions struct thread_standard_policy { 87*4d495c6eSApple OSS Distributions natural_t no_data; 88*4d495c6eSApple OSS Distributions }; 89*4d495c6eSApple OSS Distributions 90*4d495c6eSApple OSS Distributions typedef struct thread_standard_policy thread_standard_policy_data_t; 91*4d495c6eSApple OSS Distributions typedef struct thread_standard_policy *thread_standard_policy_t; 92*4d495c6eSApple OSS Distributions 93*4d495c6eSApple OSS Distributions #define THREAD_STANDARD_POLICY_COUNT 0 94*4d495c6eSApple OSS Distributions 95*4d495c6eSApple OSS Distributions /* 96*4d495c6eSApple OSS Distributions * THREAD_EXTENDED_POLICY: 97*4d495c6eSApple OSS Distributions * 98*4d495c6eSApple OSS Distributions * Extended form of THREAD_STANDARD_POLICY, which supplies a 99*4d495c6eSApple OSS Distributions * hint indicating whether this is a long running computation. 100*4d495c6eSApple OSS Distributions * 101*4d495c6eSApple OSS Distributions * Parameters: 102*4d495c6eSApple OSS Distributions * 103*4d495c6eSApple OSS Distributions * timeshare: TRUE (the default) results in identical scheduling 104*4d495c6eSApple OSS Distributions * behavior as THREAD_STANDARD_POLICY. 105*4d495c6eSApple OSS Distributions */ 106*4d495c6eSApple OSS Distributions 107*4d495c6eSApple OSS Distributions #define THREAD_EXTENDED_POLICY 1 108*4d495c6eSApple OSS Distributions 109*4d495c6eSApple OSS Distributions struct thread_extended_policy { 110*4d495c6eSApple OSS Distributions boolean_t timeshare; 111*4d495c6eSApple OSS Distributions }; 112*4d495c6eSApple OSS Distributions 113*4d495c6eSApple OSS Distributions typedef struct thread_extended_policy thread_extended_policy_data_t; 114*4d495c6eSApple OSS Distributions typedef struct thread_extended_policy *thread_extended_policy_t; 115*4d495c6eSApple OSS Distributions 116*4d495c6eSApple OSS Distributions #define THREAD_EXTENDED_POLICY_COUNT ((mach_msg_type_number_t) \ 117*4d495c6eSApple OSS Distributions (sizeof (thread_extended_policy_data_t) / sizeof (integer_t))) 118*4d495c6eSApple OSS Distributions 119*4d495c6eSApple OSS Distributions /* 120*4d495c6eSApple OSS Distributions * THREAD_TIME_CONSTRAINT_POLICY: 121*4d495c6eSApple OSS Distributions * 122*4d495c6eSApple OSS Distributions * This scheduling mode is for threads which have real time 123*4d495c6eSApple OSS Distributions * constraints on their execution. 124*4d495c6eSApple OSS Distributions * 125*4d495c6eSApple OSS Distributions * Parameters: 126*4d495c6eSApple OSS Distributions * 127*4d495c6eSApple OSS Distributions * period: This is the nominal amount of time between separate 128*4d495c6eSApple OSS Distributions * processing arrivals, specified in absolute time units. A 129*4d495c6eSApple OSS Distributions * value of 0 indicates that there is no inherent periodicity in 130*4d495c6eSApple OSS Distributions * the computation. 131*4d495c6eSApple OSS Distributions * 132*4d495c6eSApple OSS Distributions * computation: This is the nominal amount of computation 133*4d495c6eSApple OSS Distributions * time needed during a separate processing arrival, specified 134*4d495c6eSApple OSS Distributions * in absolute time units. The thread may be preempted after 135*4d495c6eSApple OSS Distributions * the computation time has elapsed. 136*4d495c6eSApple OSS Distributions * If (computation < constraint/2) it will be forced to 137*4d495c6eSApple OSS Distributions * constraint/2 to avoid unintended preemption and associated 138*4d495c6eSApple OSS Distributions * timer interrupts. 139*4d495c6eSApple OSS Distributions * 140*4d495c6eSApple OSS Distributions * constraint: This is the maximum amount of real time that 141*4d495c6eSApple OSS Distributions * may elapse from the start of a separate processing arrival 142*4d495c6eSApple OSS Distributions * to the end of computation for logically correct functioning, 143*4d495c6eSApple OSS Distributions * specified in absolute time units. Must be (>= computation). 144*4d495c6eSApple OSS Distributions * Note that latency = (constraint - computation). 145*4d495c6eSApple OSS Distributions * 146*4d495c6eSApple OSS Distributions * preemptible: IGNORED (This indicates that the computation may be 147*4d495c6eSApple OSS Distributions * interrupted, subject to the constraint specified above.) 148*4d495c6eSApple OSS Distributions */ 149*4d495c6eSApple OSS Distributions 150*4d495c6eSApple OSS Distributions #define THREAD_TIME_CONSTRAINT_POLICY 2 151*4d495c6eSApple OSS Distributions 152*4d495c6eSApple OSS Distributions struct thread_time_constraint_policy { 153*4d495c6eSApple OSS Distributions uint32_t period; 154*4d495c6eSApple OSS Distributions uint32_t computation; 155*4d495c6eSApple OSS Distributions uint32_t constraint; 156*4d495c6eSApple OSS Distributions boolean_t preemptible; 157*4d495c6eSApple OSS Distributions }; 158*4d495c6eSApple OSS Distributions 159*4d495c6eSApple OSS Distributions typedef struct thread_time_constraint_policy \ 160*4d495c6eSApple OSS Distributions thread_time_constraint_policy_data_t; 161*4d495c6eSApple OSS Distributions typedef struct thread_time_constraint_policy \ 162*4d495c6eSApple OSS Distributions *thread_time_constraint_policy_t; 163*4d495c6eSApple OSS Distributions 164*4d495c6eSApple OSS Distributions #define THREAD_TIME_CONSTRAINT_POLICY_COUNT ((mach_msg_type_number_t) \ 165*4d495c6eSApple OSS Distributions (sizeof (thread_time_constraint_policy_data_t) / sizeof (integer_t))) 166*4d495c6eSApple OSS Distributions 167*4d495c6eSApple OSS Distributions /* 168*4d495c6eSApple OSS Distributions * THREAD_PRECEDENCE_POLICY: 169*4d495c6eSApple OSS Distributions * 170*4d495c6eSApple OSS Distributions * This may be used to indicate the relative value of the 171*4d495c6eSApple OSS Distributions * computation compared to the other threads in the task. 172*4d495c6eSApple OSS Distributions * 173*4d495c6eSApple OSS Distributions * Parameters: 174*4d495c6eSApple OSS Distributions * 175*4d495c6eSApple OSS Distributions * importance: The importance is specified as a signed value. 176*4d495c6eSApple OSS Distributions */ 177*4d495c6eSApple OSS Distributions 178*4d495c6eSApple OSS Distributions #define THREAD_PRECEDENCE_POLICY 3 179*4d495c6eSApple OSS Distributions 180*4d495c6eSApple OSS Distributions struct thread_precedence_policy { 181*4d495c6eSApple OSS Distributions integer_t importance; 182*4d495c6eSApple OSS Distributions }; 183*4d495c6eSApple OSS Distributions 184*4d495c6eSApple OSS Distributions typedef struct thread_precedence_policy thread_precedence_policy_data_t; 185*4d495c6eSApple OSS Distributions typedef struct thread_precedence_policy *thread_precedence_policy_t; 186*4d495c6eSApple OSS Distributions 187*4d495c6eSApple OSS Distributions #define THREAD_PRECEDENCE_POLICY_COUNT ((mach_msg_type_number_t) \ 188*4d495c6eSApple OSS Distributions (sizeof (thread_precedence_policy_data_t) / sizeof (integer_t))) 189*4d495c6eSApple OSS Distributions 190*4d495c6eSApple OSS Distributions /* 191*4d495c6eSApple OSS Distributions * THREAD_AFFINITY_POLICY: 192*4d495c6eSApple OSS Distributions * 193*4d495c6eSApple OSS Distributions * This policy is experimental. 194*4d495c6eSApple OSS Distributions * This may be used to express affinity relationships 195*4d495c6eSApple OSS Distributions * between threads in the task. Threads with the same affinity tag will 196*4d495c6eSApple OSS Distributions * be scheduled to share an L2 cache if possible. That is, affinity tags 197*4d495c6eSApple OSS Distributions * are a hint to the scheduler for thread placement. 198*4d495c6eSApple OSS Distributions * 199*4d495c6eSApple OSS Distributions * The namespace of affinity tags is generally local to one task. However, 200*4d495c6eSApple OSS Distributions * a child task created after the assignment of affinity tags by its parent 201*4d495c6eSApple OSS Distributions * will share that namespace. In particular, a family of forked processes 202*4d495c6eSApple OSS Distributions * may be created with a shared affinity namespace. 203*4d495c6eSApple OSS Distributions * 204*4d495c6eSApple OSS Distributions * Parameters: 205*4d495c6eSApple OSS Distributions * tag: The affinity set identifier. 206*4d495c6eSApple OSS Distributions */ 207*4d495c6eSApple OSS Distributions 208*4d495c6eSApple OSS Distributions #define THREAD_AFFINITY_POLICY 4 209*4d495c6eSApple OSS Distributions 210*4d495c6eSApple OSS Distributions struct thread_affinity_policy { 211*4d495c6eSApple OSS Distributions integer_t affinity_tag; 212*4d495c6eSApple OSS Distributions }; 213*4d495c6eSApple OSS Distributions 214*4d495c6eSApple OSS Distributions #define THREAD_AFFINITY_TAG_NULL 0 215*4d495c6eSApple OSS Distributions 216*4d495c6eSApple OSS Distributions typedef struct thread_affinity_policy thread_affinity_policy_data_t; 217*4d495c6eSApple OSS Distributions typedef struct thread_affinity_policy *thread_affinity_policy_t; 218*4d495c6eSApple OSS Distributions 219*4d495c6eSApple OSS Distributions #define THREAD_AFFINITY_POLICY_COUNT ((mach_msg_type_number_t) \ 220*4d495c6eSApple OSS Distributions (sizeof (thread_affinity_policy_data_t) / sizeof (integer_t))) 221*4d495c6eSApple OSS Distributions 222*4d495c6eSApple OSS Distributions /* 223*4d495c6eSApple OSS Distributions * THREAD_BACKGROUND_POLICY: 224*4d495c6eSApple OSS Distributions */ 225*4d495c6eSApple OSS Distributions 226*4d495c6eSApple OSS Distributions #define THREAD_BACKGROUND_POLICY 5 227*4d495c6eSApple OSS Distributions 228*4d495c6eSApple OSS Distributions struct thread_background_policy { 229*4d495c6eSApple OSS Distributions integer_t priority; 230*4d495c6eSApple OSS Distributions }; 231*4d495c6eSApple OSS Distributions 232*4d495c6eSApple OSS Distributions #define THREAD_BACKGROUND_POLICY_DARWIN_BG 0x1000 233*4d495c6eSApple OSS Distributions 234*4d495c6eSApple OSS Distributions typedef struct thread_background_policy thread_background_policy_data_t; 235*4d495c6eSApple OSS Distributions typedef struct thread_background_policy *thread_background_policy_t; 236*4d495c6eSApple OSS Distributions 237*4d495c6eSApple OSS Distributions #define THREAD_BACKGROUND_POLICY_COUNT ((mach_msg_type_number_t) \ 238*4d495c6eSApple OSS Distributions (sizeof (thread_background_policy_data_t) / sizeof (integer_t))) 239*4d495c6eSApple OSS Distributions 240*4d495c6eSApple OSS Distributions 241*4d495c6eSApple OSS Distributions #define THREAD_LATENCY_QOS_POLICY 7 242*4d495c6eSApple OSS Distributions typedef integer_t thread_latency_qos_t; 243*4d495c6eSApple OSS Distributions 244*4d495c6eSApple OSS Distributions struct thread_latency_qos_policy { 245*4d495c6eSApple OSS Distributions thread_latency_qos_t thread_latency_qos_tier; 246*4d495c6eSApple OSS Distributions }; 247*4d495c6eSApple OSS Distributions 248*4d495c6eSApple OSS Distributions typedef struct thread_latency_qos_policy thread_latency_qos_policy_data_t; 249*4d495c6eSApple OSS Distributions typedef struct thread_latency_qos_policy *thread_latency_qos_policy_t; 250*4d495c6eSApple OSS Distributions 251*4d495c6eSApple OSS Distributions #define THREAD_LATENCY_QOS_POLICY_COUNT ((mach_msg_type_number_t) \ 252*4d495c6eSApple OSS Distributions (sizeof (thread_latency_qos_policy_data_t) / sizeof (integer_t))) 253*4d495c6eSApple OSS Distributions 254*4d495c6eSApple OSS Distributions #define THREAD_THROUGHPUT_QOS_POLICY 8 255*4d495c6eSApple OSS Distributions typedef integer_t thread_throughput_qos_t; 256*4d495c6eSApple OSS Distributions 257*4d495c6eSApple OSS Distributions struct thread_throughput_qos_policy { 258*4d495c6eSApple OSS Distributions thread_throughput_qos_t thread_throughput_qos_tier; 259*4d495c6eSApple OSS Distributions }; 260*4d495c6eSApple OSS Distributions 261*4d495c6eSApple OSS Distributions typedef struct thread_throughput_qos_policy thread_throughput_qos_policy_data_t; 262*4d495c6eSApple OSS Distributions typedef struct thread_throughput_qos_policy *thread_throughput_qos_policy_t; 263*4d495c6eSApple OSS Distributions 264*4d495c6eSApple OSS Distributions #define THREAD_THROUGHPUT_QOS_POLICY_COUNT ((mach_msg_type_number_t) \ 265*4d495c6eSApple OSS Distributions (sizeof (thread_throughput_qos_policy_data_t) / sizeof (integer_t))) 266*4d495c6eSApple OSS Distributions 267*4d495c6eSApple OSS Distributions #ifdef PRIVATE 268*4d495c6eSApple OSS Distributions #include <mach/thread_policy_private.h> 269*4d495c6eSApple OSS Distributions #endif 270*4d495c6eSApple OSS Distributions 271*4d495c6eSApple OSS Distributions #endif /* _MACH_THREAD_POLICY_H_ */ 272