Commit 326ae8d1 authored by Dmitriy Vyukov's avatar Dmitriy Vyukov

runtime: fix traceback in cgo programs

Fixes #6061.

R=golang-dev, bradfitz
CC=golang-dev
https://golang.org/cl/12609043
parent 1590abef
...@@ -26,6 +26,14 @@ func TestCgoSignalDeadlock(t *testing.T) { ...@@ -26,6 +26,14 @@ func TestCgoSignalDeadlock(t *testing.T) {
} }
} }
func TestCgoTraceback(t *testing.T) {
got := executeTest(t, cgoTracebackSource, nil)
want := "OK\n"
if got != want {
t.Fatalf("expected %q, but got %q", want, got)
}
}
const cgoSignalDeadlockSource = ` const cgoSignalDeadlockSource = `
package main package main
...@@ -90,3 +98,22 @@ func main() { ...@@ -90,3 +98,22 @@ func main() {
fmt.Printf("OK\n") fmt.Printf("OK\n")
} }
` `
const cgoTracebackSource = `
package main
/* void foo(void) {} */
import "C"
import (
"fmt"
"runtime"
)
func main() {
C.foo()
buf := make([]byte, 1)
runtime.Stack(buf, true)
fmt.Printf("OK\n")
}
`
...@@ -415,6 +415,8 @@ runtime·startpanic(void) ...@@ -415,6 +415,8 @@ runtime·startpanic(void)
runtime·exit(3); runtime·exit(3);
} }
m->dying = 1; m->dying = 1;
if(g != nil)
g->writebuf = nil;
runtime·xadd(&runtime·panicking, 1); runtime·xadd(&runtime·panicking, 1);
runtime·lock(&paniclk); runtime·lock(&paniclk);
} }
......
...@@ -712,11 +712,18 @@ runtime·newextram(void) ...@@ -712,11 +712,18 @@ runtime·newextram(void)
gp->sched.sp = gp->stackbase; gp->sched.sp = gp->stackbase;
gp->sched.lr = 0; gp->sched.lr = 0;
gp->sched.g = gp; gp->sched.g = gp;
gp->syscallpc = gp->sched.pc;
gp->syscallsp = gp->sched.sp;
gp->syscallstack = gp->stackbase;
gp->syscallguard = gp->stackguard;
gp->status = Gsyscall; gp->status = Gsyscall;
mp->curg = gp; mp->curg = gp;
mp->locked = LockInternal; mp->locked = LockInternal;
mp->lockedg = gp; mp->lockedg = gp;
gp->lockedm = mp; gp->lockedm = mp;
gp->goid = runtime·xadd64(&runtime·sched.goidgen, 1);
if(raceenabled)
gp->racectx = runtime·racegostart(runtime·newextram);
// put on allg for garbage collector // put on allg for garbage collector
runtime·lock(&runtime·sched); runtime·lock(&runtime·sched);
if(runtime·lastg == nil) if(runtime·lastg == nil)
...@@ -725,9 +732,6 @@ runtime·newextram(void) ...@@ -725,9 +732,6 @@ runtime·newextram(void)
runtime·lastg->alllink = gp; runtime·lastg->alllink = gp;
runtime·lastg = gp; runtime·lastg = gp;
runtime·unlock(&runtime·sched); runtime·unlock(&runtime·sched);
gp->goid = runtime·xadd64(&runtime·sched.goidgen, 1);
if(raceenabled)
gp->racectx = runtime·racegostart(runtime·newextram);
// Add m to the extra list. // Add m to the extra list.
mnext = lockextra(true); mnext = lockextra(true);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment