diff options
author | Tobias Guggenmos <tguggenm@redhat.com> | 2019-09-08 14:45:08 +0200 |
---|---|---|
committer | Tobias Guggenmos <tguggenm@redhat.com> | 2019-09-08 22:34:29 +0200 |
commit | 718e7011e08deffa915629f6f2f07767817d5813 (patch) | |
tree | 5804062e9be8fb0619c59bf56b7b3c1b99ef06a3 /rts/Schedule.c | |
parent | 6ad6303b9fa6190c495fc43fbbb4243b63d4383a (diff) | |
download | haskell-wip/ghc-debug-sched.tar.gz |
Add api to pause single threaded RTSwip/ghc-debug-sched
Improve Implementation of pausing the single threaded RTS
Stop abusing mutexes
Diffstat (limited to 'rts/Schedule.c')
-rw-r--r-- | rts/Schedule.c | 27 |
1 files changed, 27 insertions, 0 deletions
diff --git a/rts/Schedule.c b/rts/Schedule.c index e1e4a1ec92..206c981099 100644 --- a/rts/Schedule.c +++ b/rts/Schedule.c @@ -17,6 +17,7 @@ #include "Interpreter.h" #include "Printer.h" #include "RtsSignals.h" +#include "RtsAPI.h" #include "sm/Sanity.h" #include "Stats.h" #include "STM.h" @@ -256,6 +257,27 @@ schedule (Capability *initialCapability, Task *task) // * We might be left with threads blocked in foreign calls, // we should really attempt to kill these somehow (TODO). + #if !defined(THREADED_RTS) + if(nonThreadedPause.state == PAUSING){ + ACQUIRE_LOCK(&nonThreadedPause.pauseLock); + if(nonThreadedPause.state == PAUSING){ + + nonThreadedPause.state = PAUSED; + broadcastCondition(&nonThreadedPause.stateChange); + + while(nonThreadedPause.state != STARTING){ + waitCondition(&nonThreadedPause.stateChange, + &nonThreadedPause.pauseLock); + } + + nonThreadedPause.state = RUNNING; + broadcastCondition(&nonThreadedPause.stateChange); + } + + RELEASE_LOCK(&nonThreadedPause.pauseLock); + } + #endif + switch (sched_state) { case SCHED_RUNNING: break; @@ -2662,6 +2684,11 @@ initScheduler(void) blocked_queue_hd = END_TSO_QUEUE; blocked_queue_tl = END_TSO_QUEUE; sleeping_queue = END_TSO_QUEUE; + + initMutex(&nonThreadedPause.pauseLock); + initCondition(&nonThreadedPause.stateChange); + nonThreadedPause.pauseRequests = 0; + nonThreadedPause.state = RUNNING; #endif sched_state = SCHED_RUNNING; |