summaryrefslogtreecommitdiff
path: root/rts/posix/Select.c
diff options
context:
space:
mode:
authorSimon Marlow <marlowsd@gmail.com>2009-02-17 13:27:57 +0000
committerSimon Marlow <marlowsd@gmail.com>2009-02-17 13:27:57 +0000
commit536942c5b15e2cd06bb274022c670b9ecbbef465 (patch)
tree3f3bfa5661161c8456114ad30cac76baa74e4871 /rts/posix/Select.c
parentabb7803606acd590db525eb93351ea9899d93f72 (diff)
downloadhaskell-536942c5b15e2cd06bb274022c670b9ecbbef465.tar.gz
cope with ThreadRelocated on the sleeping_queue
Diffstat (limited to 'rts/posix/Select.c')
-rw-r--r--rts/posix/Select.c10
1 files changed, 8 insertions, 2 deletions
diff --git a/rts/posix/Select.c b/rts/posix/Select.c
index bf4b7ae615..32dca96cd8 100644
--- a/rts/posix/Select.c
+++ b/rts/posix/Select.c
@@ -60,9 +60,15 @@ wakeUpSleepingThreads(lnat ticks)
StgTSO *tso;
rtsBool flag = rtsFalse;
- while (sleeping_queue != END_TSO_QUEUE &&
- (int)(ticks - sleeping_queue->block_info.target) >= 0) {
+ while (sleeping_queue != END_TSO_QUEUE) {
tso = sleeping_queue;
+ if (tso->what_next == ThreadRelocated) {
+ sleeping_queue = tso->_link;
+ continue;
+ }
+ if (((long)ticks - (long)tso->block_info.target) < 0) {
+ break;
+ }
sleeping_queue = tso->_link;
tso->why_blocked = NotBlocked;
tso->_link = END_TSO_QUEUE;