305 lines
10 KiB
C
305 lines
10 KiB
C
/*
|
|
* 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 _PTHREAD_QOS_H
|
|
#define _PTHREAD_QOS_H
|
|
|
|
#include <sys/cdefs.h>
|
|
#include <sys/_pthread/_pthread_attr_t.h> /* pthread_attr_t */
|
|
#include <sys/_pthread/_pthread_t.h> /* pthread_t */
|
|
#include <Availability.h>
|
|
|
|
#if __DARWIN_C_LEVEL >= __DARWIN_C_FULL
|
|
|
|
#include <sys/qos.h>
|
|
|
|
#ifndef KERNEL
|
|
|
|
#if __has_feature(assume_nonnull)
|
|
_Pragma("clang assume_nonnull begin")
|
|
#endif
|
|
__BEGIN_DECLS
|
|
|
|
/*!
|
|
* @function pthread_attr_set_qos_class_np
|
|
*
|
|
* @abstract
|
|
* Sets the QOS class and relative priority of a pthread attribute structure
|
|
* which may be used to specify the requested QOS class of newly created
|
|
* threads.
|
|
*
|
|
* @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_attr_setschedparam() that are
|
|
* incompatible or in conflict with the QOS class system will unset the QOS
|
|
* class requested with this interface and pthread_attr_get_qos_class_np() will
|
|
* return QOS_CLASS_UNSPECIFIED.
|
|
*
|
|
* @param __attr
|
|
* The pthread attribute structure to modify.
|
|
*
|
|
* @param __qos_class
|
|
* A QOS class value:
|
|
* - QOS_CLASS_USER_INTERACTIVE
|
|
* - QOS_CLASS_USER_INITIATED
|
|
* - QOS_CLASS_DEFAULT
|
|
* - QOS_CLASS_UTILITY
|
|
* - QOS_CLASS_BACKGROUND
|
|
* 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, otherwise an errno value.
|
|
*/
|
|
__API_AVAILABLE(macos(10.10), ios(8.0))
|
|
int
|
|
pthread_attr_set_qos_class_np(pthread_attr_t *__attr,
|
|
qos_class_t __qos_class, int __relative_priority);
|
|
|
|
/*!
|
|
* @function pthread_attr_get_qos_class_np
|
|
*
|
|
* @abstract
|
|
* Gets the QOS class and relative priority of a pthread attribute structure.
|
|
*
|
|
* @param __attr
|
|
* The pthread attribute structure to inspect.
|
|
*
|
|
* @param __qos_class
|
|
* On output, a QOS class value:
|
|
* - QOS_CLASS_USER_INTERACTIVE
|
|
* - QOS_CLASS_USER_INITIATED
|
|
* - QOS_CLASS_DEFAULT
|
|
* - QOS_CLASS_UTILITY
|
|
* - QOS_CLASS_BACKGROUND
|
|
* - QOS_CLASS_UNSPECIFIED
|
|
* This value may be NULL in which case no value is returned.
|
|
*
|
|
* @param __relative_priority
|
|
* On output, a relative priority offset within the QOS class.
|
|
* This value may be NULL in which case no value is returned.
|
|
*
|
|
* @return
|
|
* Zero if successful, otherwise an errno value.
|
|
*/
|
|
__API_AVAILABLE(macos(10.10), ios(8.0))
|
|
int
|
|
pthread_attr_get_qos_class_np(pthread_attr_t * __restrict __attr,
|
|
qos_class_t * _Nullable __restrict __qos_class,
|
|
int * _Nullable __restrict __relative_priority);
|
|
|
|
/*!
|
|
* @function pthread_set_qos_class_self_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 __qos_class
|
|
* A QOS class value:
|
|
* - QOS_CLASS_USER_INTERACTIVE
|
|
* - QOS_CLASS_USER_INITIATED
|
|
* - QOS_CLASS_DEFAULT
|
|
* - QOS_CLASS_UTILITY
|
|
* - QOS_CLASS_BACKGROUND
|
|
* 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, otherwise an errno value.
|
|
*/
|
|
__API_AVAILABLE(macos(10.10), ios(8.0))
|
|
int
|
|
pthread_set_qos_class_self_np(qos_class_t __qos_class,
|
|
int __relative_priority);
|
|
|
|
/*!
|
|
* @function pthread_get_qos_class_np
|
|
*
|
|
* @abstract
|
|
* Gets the requested QOS class and relative priority of a thread.
|
|
*
|
|
* @param __pthread
|
|
* The target thread to inspect.
|
|
*
|
|
* @param __qos_class
|
|
* On output, a QOS class value:
|
|
* - QOS_CLASS_USER_INTERACTIVE
|
|
* - QOS_CLASS_USER_INITIATED
|
|
* - QOS_CLASS_DEFAULT
|
|
* - QOS_CLASS_UTILITY
|
|
* - QOS_CLASS_BACKGROUND
|
|
* - QOS_CLASS_UNSPECIFIED
|
|
* This value may be NULL in which case no value is returned.
|
|
*
|
|
* @param __relative_priority
|
|
* On output, a relative priority offset within the QOS class.
|
|
* This value may be NULL in which case no value is returned.
|
|
*
|
|
* @return
|
|
* Zero if successful, otherwise an errno value.
|
|
*/
|
|
__API_AVAILABLE(macos(10.10), ios(8.0))
|
|
int
|
|
pthread_get_qos_class_np(pthread_t __pthread,
|
|
qos_class_t * _Nullable __restrict __qos_class,
|
|
int * _Nullable __restrict __relative_priority);
|
|
|
|
/*!
|
|
* @typedef pthread_override_t
|
|
*
|
|
* @abstract
|
|
* An opaque object representing a QOS class override of a thread.
|
|
*
|
|
* @discussion
|
|
* A QOS class override of a target thread expresses that an item of pending
|
|
* work classified with a specific QOS class and relative priority depends on
|
|
* the completion of the work currently being executed by the thread (e.g. due
|
|
* to ordering requirements).
|
|
*
|
|
* While overrides are in effect, the target thread will execute at the maximum
|
|
* QOS class and relative priority of all overrides and of the QOS class
|
|
* requested by the thread itself.
|
|
*
|
|
* A QOS class override does not modify the target thread's requested QOS class
|
|
* value and the effect of an override is not visible to the qos_class_self()
|
|
* and pthread_get_qos_class_np() interfaces.
|
|
*/
|
|
|
|
typedef struct pthread_override_s* pthread_override_t;
|
|
|
|
/*!
|
|
* @function pthread_override_qos_class_start_np
|
|
*
|
|
* @abstract
|
|
* Starts a QOS class override of the specified target thread.
|
|
*
|
|
* @discussion
|
|
* Starting a QOS class override of the specified target thread expresses that
|
|
* an item of pending work classified with the specified QOS class and relative
|
|
* priority depends on the completion of the work currently being executed by
|
|
* the thread (e.g. due to ordering requirements).
|
|
*
|
|
* While overrides are in effect, the specified target thread will execute at
|
|
* the maximum QOS class and relative priority of all overrides and of the QOS
|
|
* class requested by the thread itself.
|
|
*
|
|
* Starting a QOS class override does not modify the target thread's requested
|
|
* QOS class value and the effect of an override is not visible to the
|
|
* qos_class_self() and pthread_get_qos_class_np() interfaces.
|
|
*
|
|
* The returned newly allocated override object is intended to be associated
|
|
* with the item of pending work in question. Once the dependency has been
|
|
* satisfied and enabled that work to begin executing, the QOS class override
|
|
* must be ended by passing the associated override object to
|
|
* pthread_override_qos_class_end_np(). Failure to do so will result in the
|
|
* associated resources to be leaked and the target thread to be permanently
|
|
* executed at an inappropriately elevated QOS class.
|
|
*
|
|
* @param __pthread
|
|
* The target thread to modify.
|
|
*
|
|
* @param __qos_class
|
|
* A QOS class value:
|
|
* - QOS_CLASS_USER_INTERACTIVE
|
|
* - QOS_CLASS_USER_INITIATED
|
|
* - QOS_CLASS_DEFAULT
|
|
* - QOS_CLASS_UTILITY
|
|
* - QOS_CLASS_BACKGROUND
|
|
* NULL 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.
|
|
* NULL will be returned if the value is greater than zero or less than
|
|
* QOS_MIN_RELATIVE_PRIORITY.
|
|
*
|
|
* @return
|
|
* A newly allocated override object if successful, or NULL if the override
|
|
* could not be started.
|
|
*/
|
|
__API_AVAILABLE(macos(10.10), ios(8.0))
|
|
pthread_override_t
|
|
pthread_override_qos_class_start_np(pthread_t __pthread,
|
|
qos_class_t __qos_class, int __relative_priority);
|
|
|
|
/*!
|
|
* @function pthread_override_qos_class_end_np
|
|
*
|
|
* @abstract
|
|
* Ends a QOS class override.
|
|
*
|
|
* @discussion
|
|
* Passing an override object returned by pthread_override_qos_class_start_np()
|
|
* ends the QOS class override started by that call and deallocates all
|
|
* associated resources as well as the override object itself.
|
|
*
|
|
* The thread starting and the thread ending a QOS class override need not be
|
|
* identical. If the thread ending the override is the the target thread of the
|
|
* override itself, it should take care to elevate its requested QOS class
|
|
* appropriately with pthread_set_qos_class_self_np() before ending the
|
|
* override.
|
|
*
|
|
* @param __override
|
|
* An override object returned by pthread_override_qos_class_start_np().
|
|
*
|
|
* @return
|
|
* Zero if successful, otherwise an errno value.
|
|
*/
|
|
__API_AVAILABLE(macos(10.10), ios(8.0))
|
|
int
|
|
pthread_override_qos_class_end_np(pthread_override_t __override);
|
|
|
|
__END_DECLS
|
|
#if __has_feature(assume_nonnull)
|
|
_Pragma("clang assume_nonnull end")
|
|
#endif
|
|
|
|
#endif // KERNEL
|
|
|
|
#endif // __DARWIN_C_LEVEL >= __DARWIN_C_FULL
|
|
|
|
#endif // _PTHREAD_QOS_H
|