#include "kern_internal.h"
#include <kern/debug.h>
#include <kern/assert.h>
pthread_priority_t
pthread_qos_class_get_priority(int qos)
{
switch (qos) {
case THREAD_QOS_USER_INTERACTIVE: return _pthread_priority_make_newest(QOS_CLASS_USER_INTERACTIVE, 0, 0);
case THREAD_QOS_USER_INITIATED: return _pthread_priority_make_newest(QOS_CLASS_USER_INITIATED, 0, 0);
case THREAD_QOS_LEGACY: return _pthread_priority_make_newest(QOS_CLASS_DEFAULT, 0, 0);
case THREAD_QOS_UTILITY: return _pthread_priority_make_newest(QOS_CLASS_UTILITY, 0, 0);
case THREAD_QOS_BACKGROUND: return _pthread_priority_make_newest(QOS_CLASS_BACKGROUND, 0, 0);
case THREAD_QOS_MAINTENANCE: return _pthread_priority_make_newest(QOS_CLASS_MAINTENANCE, 0, 0);
default: return _pthread_priority_make_newest(QOS_CLASS_UNSPECIFIED, 0, 0);
}
}
int
pthread_priority_get_qos_class(pthread_priority_t priority)
{
switch (_pthread_priority_get_qos_newest(priority)) {
case QOS_CLASS_USER_INTERACTIVE: return THREAD_QOS_USER_INTERACTIVE;
case QOS_CLASS_USER_INITIATED: return THREAD_QOS_USER_INITIATED;
case QOS_CLASS_DEFAULT: return THREAD_QOS_LEGACY;
case QOS_CLASS_UTILITY: return THREAD_QOS_UTILITY;
case QOS_CLASS_BACKGROUND: return THREAD_QOS_BACKGROUND;
case QOS_CLASS_MAINTENANCE: return THREAD_QOS_MAINTENANCE;
default: return THREAD_QOS_UNSPECIFIED;
}
}
pthread_priority_t
pthread_priority_from_class_index(int index)
{
qos_class_t qos;
switch (index) {
case 0: qos = QOS_CLASS_USER_INTERACTIVE; break;
case 1: qos = QOS_CLASS_USER_INITIATED; break;
case 2: qos = QOS_CLASS_DEFAULT; break;
case 3: qos = QOS_CLASS_UTILITY; break;
case 4: qos = QOS_CLASS_BACKGROUND; break;
case 5: qos = QOS_CLASS_MAINTENANCE; break;
case 6: assert(index != 6); default:
qos = QOS_CLASS_UTILITY;
}
pthread_priority_t priority;
priority = _pthread_priority_make_newest(qos, 0, 0);
return priority;
}
int
qos_get_class_index(int qos){
switch (qos){
case QOS_CLASS_USER_INTERACTIVE: return 0;
case QOS_CLASS_USER_INITIATED: return 1;
case QOS_CLASS_DEFAULT: return 2;
case QOS_CLASS_UTILITY: return 3;
case QOS_CLASS_BACKGROUND: return 4;
case QOS_CLASS_MAINTENANCE: return 5;
default:
return 2;
}
}
int
pthread_priority_get_class_index(pthread_priority_t priority)
{
return qos_get_class_index(_pthread_priority_get_qos_newest(priority));
}
integer_t
_thread_qos_from_pthread_priority(unsigned long priority, unsigned long *flags){
if (flags){
*flags = (int)_pthread_priority_get_flags(priority) >> _PTHREAD_PRIORITY_FLAGS_SHIFT;
}
return pthread_priority_get_qos_class(priority);
}