X-Git-Url: https://git.saurik.com/apple/xnu.git/blobdiff_plain/d9a64523371fa019c4575bb400cbbc3a50ac9903..c6bf4f310a33a9262d455ea4d3f0630b1255e3fe:/bsd/pthread/priority_private.h diff --git a/bsd/pthread/priority_private.h b/bsd/pthread/priority_private.h index 5d20e08b3..dbfff7e54 100644 --- a/bsd/pthread/priority_private.h +++ b/bsd/pthread/priority_private.h @@ -93,34 +93,34 @@ */ typedef unsigned long pthread_priority_t; -#define _PTHREAD_PRIORITY_FLAGS_MASK 0xff000000 -#define _PTHREAD_PRIORITY_FLAGS_SHIFT (24ull) - -#define _PTHREAD_PRIORITY_OVERCOMMIT_FLAG 0x80000000 -#define _PTHREAD_PRIORITY_INHERIT_FLAG 0x40000000 /* dispatch only */ -#define _PTHREAD_PRIORITY_ROOTQUEUE_FLAG 0x20000000 /* dispatch only */ -#define _PTHREAD_PRIORITY_SCHED_PRI_FLAG 0x20000000 -#define _PTHREAD_PRIORITY_SCHED_PRI_MASK 0x0000ffff -#define _PTHREAD_PRIORITY_ENFORCE_FLAG 0x10000000 /* dispatch only */ -#define _PTHREAD_PRIORITY_OVERRIDE_FLAG 0x08000000 /* unused */ -#define _PTHREAD_PRIORITY_FALLBACK_FLAG 0x04000000 -#define _PTHREAD_PRIORITY_EVENT_MANAGER_FLAG 0x02000000 -#define _PTHREAD_PRIORITY_NEEDS_UNBIND_FLAG 0x01000000 -#define _PTHREAD_PRIORITY_DEFAULTQUEUE_FLAG _PTHREAD_PRIORITY_FALLBACK_FLAG // compat - -#define _PTHREAD_PRIORITY_ENCODING_MASK 0x00a00000 -#define _PTHREAD_PRIORITY_ENCODING_SHIFT (22ull) -#define _PTHREAD_PRIORITY_ENCODING_V0 0x00000000 -#define _PTHREAD_PRIORITY_ENCODING_V1 0x00400000 /* unused */ -#define _PTHREAD_PRIORITY_ENCODING_V2 0x00800000 /* unused */ -#define _PTHREAD_PRIORITY_ENCODING_V3 0x00a00000 /* unused */ - -#define _PTHREAD_PRIORITY_QOS_CLASS_MASK 0x003fff00 -#define _PTHREAD_PRIORITY_VALID_QOS_CLASS_MASK 0x00003f00 -#define _PTHREAD_PRIORITY_QOS_CLASS_SHIFT (8ull) - -#define _PTHREAD_PRIORITY_PRIORITY_MASK 0x000000ff -#define _PTHREAD_PRIORITY_PRIORITY_SHIFT (0) +#define _PTHREAD_PRIORITY_FLAGS_MASK 0xff000000 +#define _PTHREAD_PRIORITY_FLAGS_SHIFT (24ull) + +#define _PTHREAD_PRIORITY_OVERCOMMIT_FLAG 0x80000000 +#define _PTHREAD_PRIORITY_INHERIT_FLAG 0x40000000 /* dispatch only */ +#define _PTHREAD_PRIORITY_ROOTQUEUE_FLAG 0x20000000 /* dispatch only */ +#define _PTHREAD_PRIORITY_SCHED_PRI_FLAG 0x20000000 +#define _PTHREAD_PRIORITY_SCHED_PRI_MASK 0x0000ffff +#define _PTHREAD_PRIORITY_ENFORCE_FLAG 0x10000000 /* dispatch only */ +#define _PTHREAD_PRIORITY_OVERRIDE_FLAG 0x08000000 /* unused */ +#define _PTHREAD_PRIORITY_FALLBACK_FLAG 0x04000000 +#define _PTHREAD_PRIORITY_EVENT_MANAGER_FLAG 0x02000000 +#define _PTHREAD_PRIORITY_NEEDS_UNBIND_FLAG 0x01000000 +#define _PTHREAD_PRIORITY_DEFAULTQUEUE_FLAG _PTHREAD_PRIORITY_FALLBACK_FLAG // compat + +#define _PTHREAD_PRIORITY_ENCODING_MASK 0x00a00000 +#define _PTHREAD_PRIORITY_ENCODING_SHIFT (22ull) +#define _PTHREAD_PRIORITY_ENCODING_V0 0x00000000 +#define _PTHREAD_PRIORITY_ENCODING_V1 0x00400000 /* unused */ +#define _PTHREAD_PRIORITY_ENCODING_V2 0x00800000 /* unused */ +#define _PTHREAD_PRIORITY_ENCODING_V3 0x00a00000 /* unused */ + +#define _PTHREAD_PRIORITY_QOS_CLASS_MASK 0x003fff00 +#define _PTHREAD_PRIORITY_VALID_QOS_CLASS_MASK 0x00003f00 +#define _PTHREAD_PRIORITY_QOS_CLASS_SHIFT (8ull) + +#define _PTHREAD_PRIORITY_PRIORITY_MASK 0x000000ff +#define _PTHREAD_PRIORITY_PRIORITY_SHIFT (0) #if PRIVATE #if XNU_KERNEL_PRIVATE && !defined(__PTHREAD_EXPOSE_INTERNALS__) @@ -139,16 +139,16 @@ static inline bool _pthread_priority_has_qos(pthread_priority_t pp) { return (pp & (_PTHREAD_PRIORITY_SCHED_PRI_FLAG | - _PTHREAD_PRIORITY_EVENT_MANAGER_FLAG)) == 0 && - (pp & (_PTHREAD_PRIORITY_QOS_CLASS_MASK & - ~_PTHREAD_PRIORITY_VALID_QOS_CLASS_MASK)) == 0 && - (pp & _PTHREAD_PRIORITY_VALID_QOS_CLASS_MASK) != 0; + _PTHREAD_PRIORITY_EVENT_MANAGER_FLAG)) == 0 && + (pp & (_PTHREAD_PRIORITY_QOS_CLASS_MASK & + ~_PTHREAD_PRIORITY_VALID_QOS_CLASS_MASK)) == 0 && + (pp & _PTHREAD_PRIORITY_VALID_QOS_CLASS_MASK) != 0; } __attribute__((always_inline, const)) static inline pthread_priority_t _pthread_priority_make_from_thread_qos(thread_qos_t qos, int relpri, - unsigned long flags) + unsigned long flags) { pthread_priority_t pp = (flags & _PTHREAD_PRIORITY_FLAGS_MASK); if (qos && qos < THREAD_QOS_LAST) { @@ -179,14 +179,21 @@ _pthread_default_priority(unsigned long flags) return _pthread_priority_make_from_thread_qos(THREAD_QOS_LEGACY, 0, flags); } +__attribute__((always_inline, const)) +static inline thread_qos_t +_pthread_priority_thread_qos_fast(pthread_priority_t pp) +{ + pp &= _PTHREAD_PRIORITY_QOS_CLASS_MASK; + pp >>= _PTHREAD_PRIORITY_QOS_CLASS_SHIFT; + return (thread_qos_t)__builtin_ffs((int)pp); +} + __attribute__((always_inline, const)) static inline thread_qos_t _pthread_priority_thread_qos(pthread_priority_t pp) { if (_pthread_priority_has_qos(pp)) { - pp &= _PTHREAD_PRIORITY_QOS_CLASS_MASK; - pp >>= _PTHREAD_PRIORITY_QOS_CLASS_SHIFT; - return (thread_qos_t)__builtin_ffs((int)pp); + return _pthread_priority_thread_qos_fast(pp); } return THREAD_QOS_UNSPECIFIED; }