summaryrefslogtreecommitdiff
path: root/rts/Schedule.c
diff options
context:
space:
mode:
authorTobias Guggenmos <tguggenm@redhat.com>2019-09-08 14:45:08 +0200
committerTobias Guggenmos <tguggenm@redhat.com>2019-09-08 22:34:29 +0200
commit718e7011e08deffa915629f6f2f07767817d5813 (patch)
tree5804062e9be8fb0619c59bf56b7b3c1b99ef06a3 /rts/Schedule.c
parent6ad6303b9fa6190c495fc43fbbb4243b63d4383a (diff)
downloadhaskell-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.c27
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;