From 22428cc7b63c35f8d9cd52b6498fe078a873ace9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Axel=20D=C3=B6rfler?= Date: Thu, 19 Apr 2007 21:25:19 +0000 Subject: [PATCH] * More or less reverted my previous thread_yield() change: while this gives threads with higher priorities a much better scheduling experience, it also creates a problem as soon as more than one higher priority thread waits on a resource held by a lower priority thread; the higher priority threads play ping-pong, and the lower priority thread doesn't get it's chance. * Increased the probability of skipping a thread priority. * I won't do any other changes on the scheduler, that's meianote's job now :-) git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@20758 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- src/system/kernel/scheduler.cpp | 4 +++- src/system/kernel/thread.c | 3 ++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/system/kernel/scheduler.cpp b/src/system/kernel/scheduler.cpp index 85f7c1d55e..06901c7390 100644 --- a/src/system/kernel/scheduler.cpp +++ b/src/system/kernel/scheduler.cpp @@ -189,12 +189,14 @@ scheduler_reschedule(void) } else { // select next thread from the run queue while (nextThread && nextThread->priority > B_IDLE_PRIORITY) { +#if 0 if (oldThread == nextThread && nextThread->was_yielded) { // ignore threads that called thread_yield() once nextThread->was_yielded = false; prevThread = nextThread; nextThread = nextThread->queue_next; } +#endif // always extract real time threads if (nextThread->priority >= B_FIRST_REAL_TIME_PRIORITY) @@ -205,7 +207,7 @@ scheduler_reschedule(void) break; // skip normal threads sometimes (roughly 16%) - if (_rand() > 0x1500) + if (_rand() > 0x2000) break; // skip until next lower priority diff --git a/src/system/kernel/thread.c b/src/system/kernel/thread.c index 336a26cb9a..b7c1802bd8 100644 --- a/src/system/kernel/thread.c +++ b/src/system/kernel/thread.c @@ -1307,7 +1307,8 @@ thread_yield(void) GRAB_THREAD_LOCK(); // mark the thread as yielded, so it will not be scheduled next - thread->was_yielded = true; + //thread->was_yielded = true; + thread->next_priority = B_LOWEST_ACTIVE_PRIORITY; scheduler_reschedule(); RELEASE_THREAD_LOCK();