diff --git a/src/kernel/pthread.cpp b/src/kernel/pthread.cpp index 47c0008..96ad1c0 100644 --- a/src/kernel/pthread.cpp +++ b/src/kernel/pthread.cpp @@ -365,6 +365,7 @@ struct PthreadAttrPrivate { uint64_t stack_map_addr; size_t stack_map_size; int policy; + int guest_priority; int inherit_sched; int solosched; bool detached; @@ -2128,13 +2129,8 @@ int KYTY_SYSV_ABI PthreadAttrGetschedparam(const PthreadAttr* attr, KernelSchedP int result = pthread_attr_getschedparam(&(*attr)->p, param); - if (param->sched_priority <= -2) { - param->sched_priority = 767; - } else if (param->sched_priority >= +2) { - param->sched_priority = 256; - } else { - param->sched_priority = 700; - } + // Host priority mapping is lossy; return the exact guest value. + param->sched_priority = (*attr)->guest_priority; if (result == 0) { return OK; @@ -2309,10 +2305,17 @@ int KYTY_SYSV_ABI PthreadAttrSetschedparam(PthreadAttr* attr, const KernelSchedP int result = pthread_attr_setschedparam(&attr_value->p, &pparam); +#if KYTY_PLATFORM == KYTY_PLATFORM_WINDOWS if (result == 0) { + attr_value->guest_priority = param->sched_priority; return OK; } return KERNEL_ERROR_EINVAL; +#else + attr_value->guest_priority = param->sched_priority; + (void)result; + return OK; +#endif } int KYTY_SYSV_ABI PthreadAttrSetschedpolicy(PthreadAttr* attr, int policy) { @@ -3639,26 +3642,15 @@ int KYTY_SYSV_ABI PthreadGetprio(Pthread thread, int* prio) { EXIT_NOT_IMPLEMENTED(prio == nullptr); - sched_param param {}; - int pol = 0; - - int result = pthread_getschedparam(thread->p, &pol, ¶m); - - if (result == 0) { - if (param.sched_priority <= -2) { - *prio = 767; - } else if (param.sched_priority >= +2) { - *prio = 256; - } else { - *prio = 700; - } - - LOGF("\t PthreadGetprio: %d, %d\n", thread->unique_id, *prio); - - return OK; + sched_param native_param {}; + int native_policy = 0; + if (pthread_getschedparam(thread->p, &native_policy, &native_param) != 0) { + return KERNEL_ERROR_EINVAL; } - return KERNEL_ERROR_EINVAL; + *prio = thread->attr->guest_priority; + LOGF("\t PthreadGetprio: %d, %d\n", thread->unique_id, *prio); + return OK; } int KYTY_SYSV_ABI PthreadSetprio(Pthread thread, int prio) { @@ -3673,25 +3665,32 @@ int KYTY_SYSV_ABI PthreadSetprio(Pthread thread, int prio) { int result = pthread_getschedparam(thread->p, &pol, ¶m); - if (result == 0) { - if (prio <= 478) { - param.sched_priority = +2; - } else if (prio >= 733) { - param.sched_priority = -2; - } else { - param.sched_priority = 0; - } - - result = pthread_setschedparam(thread->p, pol, ¶m); - - if (result == 0) { - LOGF("\t PthreadSetprio: %d, %d\n", thread->unique_id, prio); - - return OK; - } + if (result != 0) { + return KERNEL_ERROR_EINVAL; } + if (prio <= 478) { + param.sched_priority = +2; + } else if (prio >= 733) { + param.sched_priority = -2; + } else { + param.sched_priority = 0; + } + + result = pthread_setschedparam(thread->p, pol, ¶m); + + if (result == 0) { + thread->attr->guest_priority = prio; + LOGF("\t PthreadSetprio: %d, %d\n", thread->unique_id, prio); + return OK; + } + +#if KYTY_PLATFORM == KYTY_PLATFORM_WINDOWS return KERNEL_ERROR_EINVAL; +#else + thread->attr->guest_priority = prio; + return OK; +#endif } void KYTY_SYSV_ABI PthreadTestcancel() {