Skip to content

Commit

Permalink
runtime: allow copying of onM frame
Browse files Browse the repository at this point in the history
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
  • Loading branch information
dvyukov committed Aug 19, 2014
1 parent 266d350 commit 9198ed4
Showing 1 changed file with 10 additions and 1 deletion.
11 changes: 10 additions & 1 deletion src/pkg/runtime/stack.c
Expand Up @@ -399,6 +399,7 @@ struct CopyableInfo {
};

void runtime·main(void);
void runtime·switchtoM(void(*)(void));

static bool
checkframecopy(Stkframe *frame, void *arg)
Expand All @@ -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) {
Expand Down Expand Up @@ -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) {
Expand Down

0 comments on commit 9198ed4

Please sign in to comment.