summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2016-11-23 14:17:25 +0100
committerSebastian Huber <sebastian.huber@embedded-brains.de>2016-11-24 09:49:08 +0100
commitcfec4465254ad34b043bee8d4c8b320056dc123d (patch)
treed348b3dcbfeadce5378c484912bb61062c50f846
parentUse _Thread_Dispatch_direct() (diff)
downloadrtems-libbsd-cfec4465254ad34b043bee8d4c8b320056dc123d.tar.bz2
SLEEPQUEUE(9): Properly remove timeout timer
-rw-r--r--freebsd/sys/kern/subr_sleepqueue.c7
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);