diff options
| author | Dmitriy Vyukov <dvyukov@google.com> | 2014-08-19 14:24:03 +0400 |
|---|---|---|
| committer | Dmitriy Vyukov <dvyukov@google.com> | 2014-08-19 14:24:03 +0400 |
| commit | 9198ed4bd6ec7b7dd37aa2797e96f15ddbb1e6cd (patch) | |
| tree | afeab7e96da190a9804f1ecb0de8fe9399f70930 /src/pkg/runtime | |
| parent | 266d350f5e0a47dd831684eb60b69a6409ca0085 (diff) | |
| download | go-9198ed4bd6ec7b7dd37aa2797e96f15ddbb1e6cd.tar.xz | |
runtime: allow copying of onM frame
Currently goroutines in onM can't be copied/shrunk
(including the very goroutine that triggers GC).
Special case onM to allow copying.
LGTM=daniel.morsing, khr
R=golang-codereviews, daniel.morsing, khr, rsc
CC=golang-codereviews, rlh
https://golang.org/cl/124550043
Diffstat (limited to 'src/pkg/runtime')
| -rw-r--r-- | src/pkg/runtime/stack.c | 11 |
1 files changed, 10 insertions, 1 deletions
diff --git a/src/pkg/runtime/stack.c b/src/pkg/runtime/stack.c index f7d41f44d4..f21d544f33 100644 --- a/src/pkg/runtime/stack.c +++ b/src/pkg/runtime/stack.c @@ -399,6 +399,7 @@ struct CopyableInfo { }; void runtime·main(void); +void runtime·switchtoM(void(*)(void)); static bool checkframecopy(Stkframe *frame, void *arg) @@ -424,6 +425,13 @@ checkframecopy(Stkframe *frame, void *arg) cinfo->frames++; return false; // stop traceback } + if(f->entry == (uintptr)runtime·switchtoM) { + // A special routine at the bottom of stack of a goroutine that does onM call. + // We will allow it to be copied even though we don't + // have full GC info for it (because it is written in asm). + cinfo->frames++; + return true; + } if(frame->varp != (byte*)frame->sp) { // not in prologue (and has at least one local or outarg) stackmap = runtime·funcdata(f, FUNCDATA_LocalsPointerMaps); if(stackmap == nil) { @@ -648,7 +656,8 @@ adjustframe(Stkframe *frame, void *arg) f = frame->fn; if(StackDebug >= 2) runtime·printf(" adjusting %s frame=[%p,%p] pc=%p continpc=%p\n", runtime·funcname(f), frame->sp, frame->fp, frame->pc, frame->continpc); - if(f->entry == (uintptr)runtime·main) + if(f->entry == (uintptr)runtime·main || + f->entry == (uintptr)runtime·switchtoM) return true; targetpc = frame->continpc; if(targetpc == 0) { |
