diff options
author | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2016-11-23 14:17:25 +0100 |
---|---|---|
committer | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2016-11-24 09:49:08 +0100 |
commit | cfec4465254ad34b043bee8d4c8b320056dc123d (patch) | |
tree | d348b3dcbfeadce5378c484912bb61062c50f846 | |
parent | Use _Thread_Dispatch_direct() (diff) | |
download | rtems-libbsd-cfec4465254ad34b043bee8d4c8b320056dc123d.tar.bz2 |
SLEEPQUEUE(9): Properly remove timeout timer
-rw-r--r-- | freebsd/sys/kern/subr_sleepqueue.c | 7 |
1 files changed, 2 insertions, 5 deletions
diff --git a/freebsd/sys/kern/subr_sleepqueue.c b/freebsd/sys/kern/subr_sleepqueue.c index 0aed7f5c..28eb10b0 100644 --- a/freebsd/sys/kern/subr_sleepqueue.c +++ b/freebsd/sys/kern/subr_sleepqueue.c @@ -668,7 +668,6 @@ sleepq_switch(void *wchan, int pri) _Thread_Wait_release_default(executing, &lock_context); if (unblock) { - _Thread_Timer_remove(executing); _Thread_Clear_state(executing, STATES_WAITING_FOR_BSD_WAKEUP); } @@ -689,6 +688,7 @@ sleepq_switch(void *wchan, int pri) } _Thread_Wait_release_default(executing, &lock_context); + _Thread_Timer_remove(executing); if (remove) { sleepq_remove(td, wchan); @@ -951,7 +951,7 @@ sleepq_resume_thread(struct sleepqueue *sq, struct thread *td, int pri) return (setrunnable(td)); } #else /* __rtems__ */ - unblock = _Watchdog_Is_scheduled(&thread->Timer.Watchdog); + unblock = false; switch (td->td_sq_state) { case TD_SQ_SLEEPING: unblock = true; @@ -971,10 +971,7 @@ sleepq_resume_thread(struct sleepqueue *sq, struct thread *td, int pri) cpu_self = _Thread_Dispatch_disable_critical(&lock_context); _Thread_Wait_release_default(thread, &lock_context); - - _Thread_Timer_remove(thread); _Thread_Clear_state(thread, STATES_WAITING_FOR_BSD_WAKEUP); - _Thread_Dispatch_direct(cpu_self); } else { _Thread_Wait_release_default(thread, &lock_context); |