Core/Common: Corrections to core timing and add critical priority.

This commit is contained in:
Fernando Sahmkow 2021-11-27 20:31:46 +01:00
parent 846c994cc9
commit a2d29412cb
3 changed files with 11 additions and 5 deletions

View file

@ -47,6 +47,9 @@ void SetCurrentThreadPriority(ThreadPriority new_priority) {
case ThreadPriority::VeryHigh: case ThreadPriority::VeryHigh:
windows_priority = THREAD_PRIORITY_HIGHEST; windows_priority = THREAD_PRIORITY_HIGHEST;
break; break;
case ThreadPriority::Critical:
windows_priority = THREAD_PRIORITY_TIME_CRITICAL;
break;
default: default:
windows_priority = THREAD_PRIORITY_NORMAL; windows_priority = THREAD_PRIORITY_NORMAL;
break; break;
@ -59,9 +62,11 @@ void SetCurrentThreadPriority(ThreadPriority new_priority) {
void SetCurrentThreadPriority(ThreadPriority new_priority) { void SetCurrentThreadPriority(ThreadPriority new_priority) {
pthread_t this_thread = pthread_self(); pthread_t this_thread = pthread_self();
s32 max_prio = sched_get_priority_max(SCHED_OTHER); const auto scheduling_type =
s32 min_prio = sched_get_priority_min(SCHED_OTHER); new_priority != ThreadPriority::Critical ? SCHED_OTHER : SCHED_FIFO;
u32 level = static_cast<u32>(new_priority) + 1; s32 max_prio = sched_get_priority_max(scheduling_type);
s32 min_prio = sched_get_priority_min(scheduling_type);
u32 level = std::max(static_cast<u32>(new_priority) + 1, 4U);
struct sched_param params; struct sched_param params;
if (max_prio > min_prio) { if (max_prio > min_prio) {
@ -70,7 +75,7 @@ void SetCurrentThreadPriority(ThreadPriority new_priority) {
params.sched_priority = min_prio - ((min_prio - max_prio) * level) / 4; params.sched_priority = min_prio - ((min_prio - max_prio) * level) / 4;
} }
pthread_setschedparam(this_thread, SCHED_OTHER, &params); pthread_setschedparam(this_thread, scheduling_type, &params);
} }
#endif #endif

View file

@ -92,6 +92,7 @@ enum class ThreadPriority : u32 {
Normal = 1, Normal = 1,
High = 2, High = 2,
VeryHigh = 3, VeryHigh = 3,
Critical = 4,
}; };
void SetCurrentThreadPriority(ThreadPriority new_priority); void SetCurrentThreadPriority(ThreadPriority new_priority);

View file

@ -46,7 +46,7 @@ void CoreTiming::ThreadEntry(CoreTiming& instance) {
constexpr char name[] = "yuzu:HostTiming"; constexpr char name[] = "yuzu:HostTiming";
MicroProfileOnThreadCreate(name); MicroProfileOnThreadCreate(name);
Common::SetCurrentThreadName(name); Common::SetCurrentThreadName(name);
Common::SetCurrentThreadPriority(Common::ThreadPriority::VeryHigh); Common::SetCurrentThreadPriority(Common::ThreadPriority::Critical);
instance.on_thread_init(); instance.on_thread_init();
instance.ThreadLoop(); instance.ThreadLoop();
MicroProfileOnThreadExit(); MicroProfileOnThreadExit();