diff options
author | Sven Tennie <sven.tennie@gmail.com> | 2020-10-31 13:28:54 -0400 |
---|---|---|
committer | Marge Bot <ben+marge-bot@smart-cactus.org> | 2021-09-23 15:59:38 -0400 |
commit | 6f7f59901c047882ba8c9ae8812264f86b12483a (patch) | |
tree | dbff896e8fb871d947b20c3b58736b82469be89a /rts/Messages.c | |
parent | 022d9717d06542c2345e27ef018390a9d034a1f1 (diff) | |
download | haskell-6f7f59901c047882ba8c9ae8812264f86b12483a.tar.gz |
Introduce stack snapshotting / cloning (#18741)
Add `StackSnapshot#` primitive type that represents a cloned stack (StgStack).
The cloning interface consists of two functions, that clone either the treads
own stack (cloneMyStack) or another threads stack (cloneThreadStack).
The stack snapshot is offline/cold, i.e. it isn't evaluated any further. This is
useful for analyses as it prevents concurrent modifications.
For technical details, please see Note [Stack Cloning].
Co-authored-by: Ben Gamari <bgamari.foss@gmail.com>
Co-authored-by: Matthew Pickering <matthewtpickering@gmail.com>
Diffstat (limited to 'rts/Messages.c')
-rw-r--r-- | rts/Messages.c | 8 |
1 files changed, 7 insertions, 1 deletions
diff --git a/rts/Messages.c b/rts/Messages.c index 8cd0a5570f..2ec12da3ad 100644 --- a/rts/Messages.c +++ b/rts/Messages.c @@ -14,6 +14,7 @@ #include "Threads.h" #include "RaiseAsync.h" #include "sm/Storage.h" +#include "CloneStack.h" /* ---------------------------------------------------------------------------- Send a message to another Capability @@ -32,7 +33,8 @@ void sendMessage(Capability *from_cap, Capability *to_cap, Message *msg) i != &stg_MSG_BLACKHOLE_info && i != &stg_MSG_TRY_WAKEUP_info && i != &stg_IND_info && // can happen if a MSG_BLACKHOLE is revoked - i != &stg_WHITEHOLE_info) { + i != &stg_WHITEHOLE_info && + i != &stg_MSG_CLONE_STACK_info) { barf("sendMessage: %p", i); } } @@ -130,6 +132,10 @@ loop: #endif goto loop; } + else if(i == &stg_MSG_CLONE_STACK_info){ + MessageCloneStack *cloneStackMessage = (MessageCloneStack*) m; + handleCloneStackMessage(cloneStackMessage); + } else { barf("executeMessage: %p", i); |