X-Git-Url: https://git.saurik.com/apple/libpthread.git/blobdiff_plain/45deb508575711c47d78d19e326a9a26e43e63e0..c1f56ec94c29e576da2d6d7164bee1bdb2f02471:/private/pthread/qos_private.h diff --git a/private/pthread/qos_private.h b/private/pthread/qos_private.h new file mode 100644 index 0000000..4ec532c --- /dev/null +++ b/private/pthread/qos_private.h @@ -0,0 +1,221 @@ +/* + * Copyright (c) 2013-2014 Apple Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this + * file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ + +#ifndef _QOS_PRIVATE_H +#define _QOS_PRIVATE_H + +#include +#include +#include /* qos_class_t */ +#include + +#if __DARWIN_C_LEVEL >= __DARWIN_C_FULL +// allow __DARWIN_C_LEVEL to turn off the use of mach_port_t +#include +#endif + +// redeffed here to avoid leaving __QOS_ENUM defined in the public header +#define __QOS_ENUM(name, type, ...) enum { __VA_ARGS__ }; typedef type name##_t +#define __QOS_AVAILABLE_10_10 +#define __QOS_AVAILABLE_10_11 +#define __QOS_AVAILABLE_10_12 + +#if defined(__has_feature) && defined(__has_extension) +#if __has_feature(objc_fixed_enum) || __has_extension(cxx_strong_enums) +#undef __QOS_ENUM +#define __QOS_ENUM(name, type, ...) typedef enum : type { __VA_ARGS__ } name##_t +#endif +#if __has_feature(enumerator_attributes) +#undef __QOS_AVAILABLE_10_10 +#define __QOS_AVAILABLE_10_10 __API_AVAILABLE(macos(10.10), ios(8.0)) +#undef __QOS_AVAILABLE_10_11 +#define __QOS_AVAILABLE_10_11 __API_AVAILABLE(macos(10.11), ios(9.0), tvos(9.0), watchos(2.0)) +#undef __QOS_AVAILABLE_10_12 +#define __QOS_AVAILABLE_10_12 __API_AVAILABLE(macos(10.12), ios(10.0), tvos(10.0), watchos(3.0)) +#undef __QOS_AVAILABLE_10_15_1 +#define __QOS_AVAILABLE_10_15_1 __API_AVAILABLE(macos(10.15.1), ios(13.2), tvos(13.2), watchos(6.2)) +#endif +#endif + +// This enum matches workq_set_self_flags in +// xnu's workqueue_internal.h. +__QOS_ENUM(_pthread_set_flags, unsigned int, + _PTHREAD_SET_SELF_QOS_FLAG __QOS_AVAILABLE_10_10 = 0x1, + _PTHREAD_SET_SELF_VOUCHER_FLAG __QOS_AVAILABLE_10_10 = 0x2, + _PTHREAD_SET_SELF_FIXEDPRIORITY_FLAG __QOS_AVAILABLE_10_11 = 0x4, + _PTHREAD_SET_SELF_TIMESHARE_FLAG __QOS_AVAILABLE_10_11 = 0x8, + _PTHREAD_SET_SELF_WQ_KEVENT_UNBIND __QOS_AVAILABLE_10_12 = 0x10, + _PTHREAD_SET_SELF_ALTERNATE_AMX __QOS_AVAILABLE_10_15_1 = 0x20, +); + +#undef __QOS_ENUM +#undef __QOS_AVAILABLE_10_10 +#undef __QOS_AVAILABLE_10_11 +#undef __QOS_AVAILABLE_10_12 + +#ifndef KERNEL + +__BEGIN_DECLS + +/*! + * @function pthread_set_qos_class_np + * + * @abstract + * Sets the requested QOS class and relative priority of the current thread. + * + * @discussion + * The QOS class and relative priority represent an overall combination of + * system quality of service attributes on a thread. + * + * Subsequent calls to interfaces such as pthread_setschedparam() that are + * incompatible or in conflict with the QOS class system will unset the QOS + * class requested with this interface and pthread_get_qos_class_np() will + * return QOS_CLASS_UNSPECIFIED thereafter. A thread so modified is permanently + * opted-out of the QOS class system and calls to this function to request a QOS + * class for such a thread will fail and return EPERM. + * + * @param __pthread + * The current thread as returned by pthread_self(). + * EINVAL will be returned if any other thread is provided. + * + * @param __qos_class + * A QOS class value: + * - QOS_CLASS_USER_INTERACTIVE + * - QOS_CLASS_USER_INITIATED + * - QOS_CLASS_DEFAULT + * - QOS_CLASS_UTILITY + * - QOS_CLASS_BACKGROUND + * - QOS_CLASS_MAINTENANCE + * EINVAL will be returned if any other value is provided. + * + * @param __relative_priority + * A relative priority within the QOS class. This value is a negative offset + * from the maximum supported scheduler priority for the given class. + * EINVAL will be returned if the value is greater than zero or less than + * QOS_MIN_RELATIVE_PRIORITY. + * + * @return + * Zero if successful, othwerise an errno value. + */ +__API_DEPRECATED_WITH_REPLACEMENT("pthread_set_qos_class_self_np", macos(10.10, 10.10), ios(8.0, 8.0)) +int +pthread_set_qos_class_np(pthread_t __pthread, + qos_class_t __qos_class, + int __relative_priority); + +/* Private interfaces for libdispatch to encode/decode specific values of pthread_priority_t. */ + +// Encode a class+priority pair into a pthread_priority_t, +__API_AVAILABLE(macos(10.10), ios(8.0)) +pthread_priority_t +_pthread_qos_class_encode(qos_class_t qos_class, int relative_priority, unsigned long flags); + +// Decode a pthread_priority_t into a class+priority pair. +__API_AVAILABLE(macos(10.10), ios(8.0)) +qos_class_t +_pthread_qos_class_decode(pthread_priority_t priority, int *relative_priority, unsigned long *flags); + +// Encode a legacy workqueue API priority into a pthread_priority_t. This API +// is deprecated and can be removed when the simulator no longer uses it. +__API_DEPRECATED("no longer used", macos(10.10, 10.13), ios(8.0, 11.0)) +pthread_priority_t +_pthread_qos_class_encode_workqueue(int queue_priority, unsigned long flags); + +#if __DARWIN_C_LEVEL >= __DARWIN_C_FULL + +// Set QoS or voucher, or both, on pthread_self() +__API_AVAILABLE(macos(10.10), ios(8.0)) +int +_pthread_set_properties_self(_pthread_set_flags_t flags, pthread_priority_t priority, mach_port_t voucher); + +// Set self to fixed priority without disturbing QoS or priority +__API_AVAILABLE(macos(10.10), ios(8.0)) +int +pthread_set_fixedpriority_self(void); + +// Inverse of pthread_set_fixedpriority_self() +__API_AVAILABLE(macos(10.10), ios(8.0)) +int +pthread_set_timeshare_self(void); + +// Set self to avoid running on the same AMX as +// other work in this group. +// Only allowed on non-workqueue pthreads +__API_AVAILABLE(macos(10.15.1), ios(13.2), tvos(13.2), watchos(6.2)) +int +pthread_prefer_alternate_amx_self(void); + +/*! + * @const PTHREAD_MAX_PARALLELISM_PHYSICAL + * Flag that can be used with pthread_qos_max_parallelism() and + * pthread_time_constraint_max_parallelism() to ask for a count of physical + * compute units available for parallelism (default is logical). + */ +#define PTHREAD_MAX_PARALLELISM_PHYSICAL 0x1 + +/*! + * @function pthread_qos_max_parallelism + * + * @abstract + * Returns the number of compute units available for parallel computation at + * a specified QoS class. + * + * @param qos + * The specified QoS class. + * + * @param flags + * 0 or PTHREAD_MAX_PARALLELISM_PHYSICAL. + * + * @return + * The number of compute units available for parallel computation for the + * specified QoS, or -1 on failure (with errno set accordingly). + */ +__API_AVAILABLE(macos(10.13), ios(11.0), tvos(11.0), watchos(4.0)) +int +pthread_qos_max_parallelism(qos_class_t qos, unsigned long flags); + +/*! + * @function pthread_time_constraint_max_parallelism() + * + * @abstract + * Returns the number of compute units available for parallel computation on + * realtime threads. + * + * @param flags + * 0 or PTHREAD_MAX_PARALLELISM_PHYSICAL. + * + * @return + * The number of compute units available for parallel computation on realtime + * threads, or -1 on failure (with errno set accordingly). + */ +__API_AVAILABLE(macos(10.13), ios(11.0), tvos(11.0), watchos(4.0)) +int +pthread_time_constraint_max_parallelism(unsigned long flags); + +#endif // __DARWIN_C_LEVEL >= __DARWIN_C_FULL + +__END_DECLS + +#endif // KERNEL + +#endif //_QOS_PRIVATE_H