/ duct-tape / pthread / sys / qos.h
qos.h
  1  /*
  2   * Copyright (c) 2013-2014 Apple Inc. All rights reserved.
  3   *
  4   * @APPLE_LICENSE_HEADER_START@
  5   *
  6   * This file contains Original Code and/or Modifications of Original Code
  7   * as defined in and that are subject to the Apple Public Source License
  8   * Version 2.0 (the 'License'). You may not use this file except in
  9   * compliance with the License. Please obtain a copy of the License at
 10   * http://www.opensource.apple.com/apsl/ and read it before using this
 11   * file.
 12   *
 13   * The Original Code and all software distributed under the License are
 14   * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
 15   * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
 16   * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
 17   * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
 18   * Please see the License for the specific language governing rights and
 19   * limitations under the License.
 20   *
 21   * @APPLE_LICENSE_HEADER_END@
 22   */
 23  
 24  #ifndef _SYS_QOS_H
 25  #define _SYS_QOS_H
 26  
 27  #include <sys/cdefs.h>
 28  #include <Availability.h>
 29  
 30  /*!
 31   * @typedef qos_class_t
 32   *
 33   * @abstract
 34   * An abstract thread quality of service (QOS) classification.
 35   *
 36   * @discussion
 37   * Thread quality of service (QOS) classes are ordered abstract representations
 38   * of the nature of work that is expected to be performed by a pthread, dispatch
 39   * queue, or NSOperation. Each class specifies a maximum thread scheduling
 40   * priority for that band (which may be used in combination with a relative
 41   * priority offset within the band), as well as quality of service
 42   * characteristics for timer latency, CPU throughput, I/O throughput, network
 43   * socket traffic management behavior and more.
 44   *
 45   * A best effort is made to allocate available system resources to every QOS
 46   * class. Quality of service degredation only occurs during system resource
 47   * contention, proportionally to the QOS class. That said, QOS classes
 48   * representing user-initiated work attempt to achieve peak throughput while
 49   * QOS classes for other work attempt to achieve peak energy and thermal
 50   * efficiency, even in the absence of contention. Finally, the use of QOS
 51   * classes does not allow threads to supersede any limits that may be applied
 52   * to the overall process.
 53   */
 54  
 55  /*!
 56   * @constant QOS_CLASS_USER_INTERACTIVE
 57   * @abstract A QOS class which indicates work performed by this thread
 58   * is interactive with the user.
 59   * @discussion Such work is requested to run at high priority relative to other
 60   * work on the system. Specifying this QOS class is a request to run with
 61   * nearly all available system CPU and I/O bandwidth even under contention.
 62   * This is not an energy-efficient QOS class to use for large tasks. The use of
 63   * this QOS class should be limited to critical interaction with the user such
 64   * as handling events on the main event loop, view drawing, animation, etc.
 65   *
 66   * @constant QOS_CLASS_USER_INITIATED
 67   * @abstract A QOS class which indicates work performed by this thread
 68   * was initiated by the user and that the user is likely waiting for the
 69   * results.
 70   * @discussion Such work is requested to run at a priority below critical user-
 71   * interactive work, but relatively higher than other work on the system. This
 72   * is not an energy-efficient QOS class to use for large tasks. Its use
 73   * should be limited to operations of short enough duration that the user is
 74   * unlikely to switch tasks while waiting for the results. Typical
 75   * user-initiated work will have progress indicated by the display of
 76   * placeholder content or modal user interface.
 77   *
 78   * @constant QOS_CLASS_DEFAULT
 79   * @abstract A default QOS class used by the system in cases where more specific
 80   * QOS class information is not available.
 81   * @discussion Such work is requested to run at a priority below critical user-
 82   * interactive and user-initiated work, but relatively higher than utility and
 83   * background tasks. Threads created by pthread_create() without an attribute
 84   * specifying a QOS class will default to QOS_CLASS_DEFAULT. This QOS class
 85   * value is not intended to be used as a work classification, it should only be
 86   * set when propagating or restoring QOS class values provided by the system.
 87   *
 88   * @constant QOS_CLASS_UTILITY
 89   * @abstract A QOS class which indicates work performed by this thread
 90   * may or may not be initiated by the user and that the user is unlikely to be
 91   * immediately waiting for the results.
 92   * @discussion Such work is requested to run at a priority below critical user-
 93   * interactive and user-initiated work, but relatively higher than low-level
 94   * system maintenance tasks. The use of this QOS class indicates the work
 95   * should be run in an energy and thermally-efficient manner. The progress of
 96   * utility work may or may not be indicated to the user, but the effect of such
 97   * work is user-visible.
 98   *
 99   * @constant QOS_CLASS_BACKGROUND
100   * @abstract A QOS class which indicates work performed by this thread was not
101   * initiated by the user and that the user may be unaware of the results.
102   * @discussion Such work is requested to run at a priority below other work.
103   * The use of this QOS class indicates the work should be run in the most energy
104   * and thermally-efficient manner.
105   *
106   * @constant QOS_CLASS_UNSPECIFIED
107   * @abstract A QOS class value which indicates the absence or removal of QOS
108   * class information.
109   * @discussion As an API return value, may indicate that threads or pthread
110   * attributes were configured with legacy API incompatible or in conflict with
111   * the QOS class system.
112   */
113  
114  #define __QOS_ENUM(name, type, ...) enum { __VA_ARGS__ }; typedef type name##_t
115  #define __QOS_CLASS_AVAILABLE(...)
116  
117  #if defined(__cplusplus) || defined(__OBJC__) || __LP64__
118  #if defined(__has_feature) && defined(__has_extension)
119  #if __has_feature(objc_fixed_enum) || __has_extension(cxx_strong_enums)
120  #undef __QOS_ENUM
121  #define __QOS_ENUM(name, type, ...) typedef enum : type { __VA_ARGS__ } name##_t
122  #endif
123  #endif
124  #if __has_feature(enumerator_attributes)
125  #undef __QOS_CLASS_AVAILABLE
126  #define __QOS_CLASS_AVAILABLE __API_AVAILABLE
127  #endif
128  #endif
129  
130  __QOS_ENUM(qos_class, unsigned int,
131  	QOS_CLASS_USER_INTERACTIVE
132  			__QOS_CLASS_AVAILABLE(macos(10.10), ios(8.0)) = 0x21,
133  	QOS_CLASS_USER_INITIATED
134  			__QOS_CLASS_AVAILABLE(macos(10.10), ios(8.0)) = 0x19,
135  	QOS_CLASS_DEFAULT
136  			__QOS_CLASS_AVAILABLE(macos(10.10), ios(8.0)) = 0x15,
137  	QOS_CLASS_UTILITY
138  			__QOS_CLASS_AVAILABLE(macos(10.10), ios(8.0)) = 0x11,
139  	QOS_CLASS_BACKGROUND
140  			__QOS_CLASS_AVAILABLE(macos(10.10), ios(8.0)) = 0x09,
141  	QOS_CLASS_UNSPECIFIED
142  			__QOS_CLASS_AVAILABLE(macos(10.10), ios(8.0)) = 0x00,
143  );
144  
145  #undef __QOS_ENUM
146  
147  /*!
148   * @constant QOS_MIN_RELATIVE_PRIORITY
149   * @abstract The minimum relative priority that may be specified within a
150   * QOS class. These priorities are relative only within a given QOS class
151   * and meaningful only for the current process.
152   */
153  #define QOS_MIN_RELATIVE_PRIORITY (-15)
154  
155  /* Userspace (only) definitions */
156  
157  #ifndef KERNEL
158  
159  __BEGIN_DECLS
160  
161  /*!
162   * @function qos_class_self
163   *
164   * @abstract
165   * Returns the requested QOS class of the current thread.
166   *
167   * @return
168   * One of the QOS class values in qos_class_t.
169   */
170  __API_AVAILABLE(macos(10.10), ios(8.0))
171  qos_class_t
172  qos_class_self(void);
173  
174  /*!
175   * @function qos_class_main
176   *
177   * @abstract
178   * Returns the initial requested QOS class of the main thread.
179   *
180   * @discussion
181   * The QOS class that the main thread of a process is created with depends on
182   * the type of process (e.g. application or daemon) and on how it has been
183   * launched.
184   *
185   * This function returns that initial requested QOS class value chosen by the
186   * system to enable propagation of that classification to matching work not
187   * executing on the main thread.
188   *
189   * @return
190   * One of the QOS class values in qos_class_t.
191   */
192  __API_AVAILABLE(macos(10.10), ios(8.0))
193  qos_class_t
194  qos_class_main(void);
195  
196  __END_DECLS
197  
198  #endif // KERNEL
199  
200  #endif // _SYS_QOS_H