Move the handling of still running threads into scheduler_enqueue_in_run_queue().
This should be in line with all uses of scheduler_enqueue_in_run_queue() and simplifies a few places where it is used. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@23738 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
@@ -365,10 +365,8 @@ PrivateConditionVariable::_Notify(bool all, status_t result)
|
|||||||
|
|
||||||
// wake up the thread
|
// wake up the thread
|
||||||
thread->condition_variable_entry = NULL;
|
thread->condition_variable_entry = NULL;
|
||||||
if (thread->state == B_THREAD_WAITING) {
|
if (thread->state == B_THREAD_WAITING)
|
||||||
thread->state = B_THREAD_READY;
|
|
||||||
scheduler_enqueue_in_run_queue(thread);
|
scheduler_enqueue_in_run_queue(thread);
|
||||||
}
|
|
||||||
|
|
||||||
if (!all)
|
if (!all)
|
||||||
break;
|
break;
|
||||||
@@ -412,7 +410,6 @@ condition_variable_interrupt_thread(struct thread* thread)
|
|||||||
|
|
||||||
// wake up the thread
|
// wake up the thread
|
||||||
thread->condition_variable_entry = NULL;
|
thread->condition_variable_entry = NULL;
|
||||||
thread->state = B_THREAD_READY;
|
|
||||||
scheduler_enqueue_in_run_queue(thread);
|
scheduler_enqueue_in_run_queue(thread);
|
||||||
|
|
||||||
return B_OK;
|
return B_OK;
|
||||||
|
|||||||
@@ -2363,7 +2363,6 @@ _user_debug_thread(thread_id threadID)
|
|||||||
switch (thread->state) {
|
switch (thread->state) {
|
||||||
case B_THREAD_SUSPENDED:
|
case B_THREAD_SUSPENDED:
|
||||||
// thread suspended: wake it up
|
// thread suspended: wake it up
|
||||||
thread->state = thread->next_state = B_THREAD_READY;
|
|
||||||
scheduler_enqueue_in_run_queue(thread);
|
scheduler_enqueue_in_run_queue(thread);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
|||||||
@@ -301,11 +301,8 @@ notify_loading_app(status_t result, bool suspend)
|
|||||||
GRAB_THREAD_LOCK();
|
GRAB_THREAD_LOCK();
|
||||||
|
|
||||||
// wake up the waiting thread
|
// wake up the waiting thread
|
||||||
if (loadingInfo->thread->state == B_THREAD_SUSPENDED) {
|
if (loadingInfo->thread->state == B_THREAD_SUSPENDED)
|
||||||
loadingInfo->thread->state = B_THREAD_READY;
|
|
||||||
loadingInfo->thread->next_state = B_THREAD_READY;
|
|
||||||
scheduler_enqueue_in_run_queue(loadingInfo->thread);
|
scheduler_enqueue_in_run_queue(loadingInfo->thread);
|
||||||
}
|
|
||||||
|
|
||||||
// suspend ourselves, if desired
|
// suspend ourselves, if desired
|
||||||
if (suspend) {
|
if (suspend) {
|
||||||
|
|||||||
@@ -74,8 +74,17 @@ dump_run_queue(int argc, char **argv)
|
|||||||
void
|
void
|
||||||
scheduler_enqueue_in_run_queue(struct thread *thread)
|
scheduler_enqueue_in_run_queue(struct thread *thread)
|
||||||
{
|
{
|
||||||
struct thread *curr, *prev;
|
if (thread->state == B_THREAD_RUNNING) {
|
||||||
|
// The thread is currently running (on another CPU) and we cannot
|
||||||
|
// insert it into the run queue. Set the next state to ready so the
|
||||||
|
// thread is inserted into the run queue on the next reschedule.
|
||||||
|
thread->next_state = B_THREAD_READY;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
thread->state = thread->next_state = B_THREAD_READY;
|
||||||
|
|
||||||
|
struct thread *curr, *prev;
|
||||||
for (curr = sRunQueue, prev = NULL; curr
|
for (curr = sRunQueue, prev = NULL; curr
|
||||||
&& curr->priority >= thread->next_priority;
|
&& curr->priority >= thread->next_priority;
|
||||||
curr = curr->queue_next) {
|
curr = curr->queue_next) {
|
||||||
@@ -153,6 +162,7 @@ scheduler_reschedule(void)
|
|||||||
|
|
||||||
TRACE(("reschedule(): cpu %d, cur_thread = 0x%lx\n", smp_get_current_cpu(), thread_get_current_thread()->id));
|
TRACE(("reschedule(): cpu %d, cur_thread = 0x%lx\n", smp_get_current_cpu(), thread_get_current_thread()->id));
|
||||||
|
|
||||||
|
oldThread->state = oldThread->next_state;
|
||||||
switch (oldThread->next_state) {
|
switch (oldThread->next_state) {
|
||||||
case B_THREAD_RUNNING:
|
case B_THREAD_RUNNING:
|
||||||
case B_THREAD_READY:
|
case B_THREAD_READY:
|
||||||
@@ -171,7 +181,6 @@ scheduler_reschedule(void)
|
|||||||
TRACE(("not enqueueing thread 0x%lx into run q. next_state = %ld\n", oldThread->id, oldThread->next_state));
|
TRACE(("not enqueueing thread 0x%lx into run q. next_state = %ld\n", oldThread->id, oldThread->next_state));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
oldThread->state = oldThread->next_state;
|
|
||||||
|
|
||||||
nextThread = sRunQueue;
|
nextThread = sRunQueue;
|
||||||
prevThread = NULL;
|
prevThread = NULL;
|
||||||
|
|||||||
+12
-38
@@ -319,14 +319,9 @@ sem_timeout(timer *data)
|
|||||||
|
|
||||||
GRAB_THREAD_LOCK();
|
GRAB_THREAD_LOCK();
|
||||||
// put the threads in the run q here to make sure we dont deadlock in sem_interrupt_thread
|
// put the threads in the run q here to make sure we dont deadlock in sem_interrupt_thread
|
||||||
while ((thread = thread_dequeue(&wakeupQueue)) != NULL) {
|
while ((thread = thread_dequeue(&wakeupQueue)) != NULL)
|
||||||
if (thread->state == B_THREAD_RUNNING)
|
scheduler_enqueue_in_run_queue(thread);
|
||||||
thread->next_state = B_THREAD_READY;
|
|
||||||
else {
|
|
||||||
thread->state = thread->next_state = B_THREAD_READY;
|
|
||||||
scheduler_enqueue_in_run_queue(thread);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
RELEASE_THREAD_LOCK();
|
RELEASE_THREAD_LOCK();
|
||||||
|
|
||||||
restore_interrupts(state);
|
restore_interrupts(state);
|
||||||
@@ -614,14 +609,8 @@ sem_interrupt_thread(struct thread *thread)
|
|||||||
|
|
||||||
RELEASE_SEM_LOCK(sSems[slot]);
|
RELEASE_SEM_LOCK(sSems[slot]);
|
||||||
|
|
||||||
while ((thread = thread_dequeue(&wakeupQueue)) != NULL) {
|
while ((thread = thread_dequeue(&wakeupQueue)) != NULL)
|
||||||
if (thread->state == B_THREAD_RUNNING)
|
scheduler_enqueue_in_run_queue(thread);
|
||||||
thread->next_state = B_THREAD_READY;
|
|
||||||
else {
|
|
||||||
thread->state = thread->next_state = B_THREAD_READY;
|
|
||||||
scheduler_enqueue_in_run_queue(thread);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return B_NO_ERROR;
|
return B_NO_ERROR;
|
||||||
}
|
}
|
||||||
@@ -792,14 +781,9 @@ delete_sem(sem_id id)
|
|||||||
|
|
||||||
if (releasedThreads > 0) {
|
if (releasedThreads > 0) {
|
||||||
GRAB_THREAD_LOCK();
|
GRAB_THREAD_LOCK();
|
||||||
while ((thread = thread_dequeue(&releaseQueue)) != NULL) {
|
while ((thread = thread_dequeue(&releaseQueue)) != NULL)
|
||||||
if (thread->state == B_THREAD_RUNNING)
|
scheduler_enqueue_in_run_queue(thread);
|
||||||
thread->next_state = B_THREAD_READY;
|
|
||||||
else {
|
|
||||||
thread->state = thread->next_state = B_THREAD_READY;
|
|
||||||
scheduler_enqueue_in_run_queue(thread);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
scheduler_reschedule();
|
scheduler_reschedule();
|
||||||
RELEASE_THREAD_LOCK();
|
RELEASE_THREAD_LOCK();
|
||||||
}
|
}
|
||||||
@@ -955,14 +939,9 @@ switch_sem_etc(sem_id semToBeReleased, sem_id id, int32 count,
|
|||||||
B_INTERRUPTED, true);
|
B_INTERRUPTED, true);
|
||||||
}
|
}
|
||||||
RELEASE_SEM_LOCK(sSems[slot]);
|
RELEASE_SEM_LOCK(sSems[slot]);
|
||||||
while ((thread = thread_dequeue(&wakeupQueue)) != NULL) {
|
while ((thread = thread_dequeue(&wakeupQueue)) != NULL)
|
||||||
if (thread->state == B_THREAD_RUNNING)
|
scheduler_enqueue_in_run_queue(thread);
|
||||||
thread->next_state = B_THREAD_READY;
|
|
||||||
else {
|
|
||||||
thread->state = thread->next_state = B_THREAD_READY;
|
|
||||||
scheduler_enqueue_in_run_queue(thread);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// fall through and reschedule since another thread with a higher priority may have been woken up
|
// fall through and reschedule since another thread with a higher priority may have been woken up
|
||||||
}
|
}
|
||||||
scheduler_reschedule();
|
scheduler_reschedule();
|
||||||
@@ -1108,12 +1087,7 @@ release_sem_etc(sem_id id, int32 count, uint32 flags)
|
|||||||
thread->next_priority = thread->priority >= B_FIRST_REAL_TIME_PRIORITY ?
|
thread->next_priority = thread->priority >= B_FIRST_REAL_TIME_PRIORITY ?
|
||||||
thread->priority : thread->priority + 1;
|
thread->priority : thread->priority + 1;
|
||||||
#endif
|
#endif
|
||||||
if (thread->state == B_THREAD_RUNNING)
|
scheduler_enqueue_in_run_queue(thread);
|
||||||
thread->next_state = B_THREAD_READY;
|
|
||||||
else {
|
|
||||||
thread->state = thread->next_state = B_THREAD_READY;
|
|
||||||
scheduler_enqueue_in_run_queue(thread);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
if ((flags & B_DO_NOT_RESCHEDULE) == 0)
|
if ((flags & B_DO_NOT_RESCHEDULE) == 0)
|
||||||
scheduler_reschedule();
|
scheduler_reschedule();
|
||||||
|
|||||||
@@ -462,10 +462,8 @@ deliver_signal(struct thread *thread, uint signal, uint32 flags)
|
|||||||
|
|
||||||
if (thread->team == team_get_kernel_team()) {
|
if (thread->team == team_get_kernel_team()) {
|
||||||
// Signals to kernel threads will only wake them up
|
// Signals to kernel threads will only wake them up
|
||||||
if (thread->state == B_THREAD_SUSPENDED) {
|
if (thread->state == B_THREAD_SUSPENDED)
|
||||||
thread->state = thread->next_state = B_THREAD_READY;
|
|
||||||
scheduler_enqueue_in_run_queue(thread);
|
scheduler_enqueue_in_run_queue(thread);
|
||||||
}
|
|
||||||
return B_OK;
|
return B_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -479,29 +477,25 @@ deliver_signal(struct thread *thread, uint signal, uint32 flags)
|
|||||||
|
|
||||||
mainThread->sig_pending |= SIGNAL_TO_MASK(SIGKILLTHR);
|
mainThread->sig_pending |= SIGNAL_TO_MASK(SIGKILLTHR);
|
||||||
// Wake up main thread
|
// Wake up main thread
|
||||||
if (mainThread->state == B_THREAD_SUSPENDED) {
|
if (mainThread->state == B_THREAD_SUSPENDED)
|
||||||
mainThread->state = mainThread->next_state = B_THREAD_READY;
|
|
||||||
scheduler_enqueue_in_run_queue(mainThread);
|
scheduler_enqueue_in_run_queue(mainThread);
|
||||||
} else if (mainThread->state == B_THREAD_WAITING)
|
else if (mainThread->state == B_THREAD_WAITING)
|
||||||
signal_interrupt_thread(mainThread);
|
signal_interrupt_thread(mainThread);
|
||||||
|
|
||||||
// Supposed to fall through
|
// Supposed to fall through
|
||||||
}
|
}
|
||||||
case SIGKILLTHR:
|
case SIGKILLTHR:
|
||||||
// Wake up suspended threads and interrupt waiting ones
|
// Wake up suspended threads and interrupt waiting ones
|
||||||
if (thread->state == B_THREAD_SUSPENDED) {
|
if (thread->state == B_THREAD_SUSPENDED)
|
||||||
thread->state = thread->next_state = B_THREAD_READY;
|
|
||||||
scheduler_enqueue_in_run_queue(thread);
|
scheduler_enqueue_in_run_queue(thread);
|
||||||
} else if (thread->state == B_THREAD_WAITING)
|
else if (thread->state == B_THREAD_WAITING)
|
||||||
signal_interrupt_thread(thread);
|
signal_interrupt_thread(thread);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case SIGCONT:
|
case SIGCONT:
|
||||||
// Wake up thread if it was suspended
|
// Wake up thread if it was suspended
|
||||||
if (thread->state == B_THREAD_SUSPENDED) {
|
if (thread->state == B_THREAD_SUSPENDED)
|
||||||
thread->state = thread->next_state = B_THREAD_READY;
|
|
||||||
scheduler_enqueue_in_run_queue(thread);
|
scheduler_enqueue_in_run_queue(thread);
|
||||||
}
|
|
||||||
|
|
||||||
atomic_and(&thread->sig_pending, ~STOP_SIGNALS);
|
atomic_and(&thread->sig_pending, ~STOP_SIGNALS);
|
||||||
// remove any pending stop signals
|
// remove any pending stop signals
|
||||||
|
|||||||
@@ -1159,10 +1159,8 @@ load_image_etc(int32 argCount, char * const *args, int32 envCount,
|
|||||||
mainThread = thread_get_thread_struct_locked(thread);
|
mainThread = thread_get_thread_struct_locked(thread);
|
||||||
if (mainThread) {
|
if (mainThread) {
|
||||||
// resume the team's main thread
|
// resume the team's main thread
|
||||||
if (mainThread->state == B_THREAD_SUSPENDED) {
|
if (mainThread->state == B_THREAD_SUSPENDED)
|
||||||
mainThread->state = mainThread->next_state = B_THREAD_READY;
|
|
||||||
scheduler_enqueue_in_run_queue(mainThread);
|
scheduler_enqueue_in_run_queue(mainThread);
|
||||||
}
|
|
||||||
|
|
||||||
// Now suspend ourselves until loading is finished.
|
// Now suspend ourselves until loading is finished.
|
||||||
// We will be woken either by the thread, when it finished or
|
// We will be woken either by the thread, when it finished or
|
||||||
@@ -2159,11 +2157,8 @@ team_delete_team(struct team *team)
|
|||||||
GRAB_THREAD_LOCK();
|
GRAB_THREAD_LOCK();
|
||||||
|
|
||||||
// wake up the waiting thread
|
// wake up the waiting thread
|
||||||
if (loadingInfo->thread->state == B_THREAD_SUSPENDED) {
|
if (loadingInfo->thread->state == B_THREAD_SUSPENDED)
|
||||||
loadingInfo->thread->state = B_THREAD_READY;
|
|
||||||
loadingInfo->thread->next_state = B_THREAD_READY;
|
|
||||||
scheduler_enqueue_in_run_queue(loadingInfo->thread);
|
scheduler_enqueue_in_run_queue(loadingInfo->thread);
|
||||||
}
|
|
||||||
|
|
||||||
RELEASE_THREAD_LOCK();
|
RELEASE_THREAD_LOCK();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -937,7 +937,6 @@ make_thread_resumed(int argc, char **argv)
|
|||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (thread->state == B_THREAD_SUSPENDED) {
|
if (thread->state == B_THREAD_SUSPENDED) {
|
||||||
thread->state = thread->next_state = B_THREAD_READY;
|
|
||||||
scheduler_enqueue_in_run_queue(thread);
|
scheduler_enqueue_in_run_queue(thread);
|
||||||
kprintf("thread %ld resumed\n", thread->id);
|
kprintf("thread %ld resumed\n", thread->id);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user