projects
/
ghc-hetmet.git
/ commitdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
| commitdiff |
tree
raw
|
patch
|
inline
| side by side (parent:
c039455
)
don't yield if the system is shutting down
author
Simon Marlow
<marlowsd@gmail.com>
Thu, 6 Nov 2008 15:53:56 +0000
(15:53 +0000)
committer
Simon Marlow
<marlowsd@gmail.com>
Thu, 6 Nov 2008 15:53:56 +0000
(15:53 +0000)
rts/Schedule.c
patch
|
blob
|
history
diff --git
a/rts/Schedule.c
b/rts/Schedule.c
index
8c2c3de
..
63e2e99
100644
(file)
--- a/
rts/Schedule.c
+++ b/
rts/Schedule.c
@@
-700,7
+700,9
@@
shouldYieldCapability (Capability *cap, Task *task)
// - we need to yield this Capability to someone else
// (see shouldYieldCapability())
//
// - we need to yield this Capability to someone else
// (see shouldYieldCapability())
//
-// The return value indicates whether
+// Careful: the scheduler loop is quite delicate. Make sure you run
+// the tests in testsuite/concurrent (all ways) after modifying this,
+// and also check the benchmarks in nofib/parallel for regressions.
static void
scheduleYield (Capability **pcap, Task *task)
static void
scheduleYield (Capability **pcap, Task *task)
@@
-709,7
+711,9
@@
scheduleYield (Capability **pcap, Task *task)
// if we have work, and we don't need to give up the Capability, continue.
if (!shouldYieldCapability(cap,task) &&
// if we have work, and we don't need to give up the Capability, continue.
if (!shouldYieldCapability(cap,task) &&
- (!emptyRunQueue(cap) || blackholes_need_checking))
+ (!emptyRunQueue(cap) ||
+ blackholes_need_checking ||
+ sched_state >= SCHED_INTERRUPTING))
return;
// otherwise yield (sleep), and keep yielding if necessary.
return;
// otherwise yield (sleep), and keep yielding if necessary.