mirror of
https://github.com/golang/go
synced 2024-11-12 09:50:21 -07:00
runtime: fix traceback in cgo programs
Fixes #6061. R=golang-dev, bradfitz CC=golang-dev https://golang.org/cl/12609043
This commit is contained in:
parent
1590abef03
commit
326ae8d14e
@ -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 = `
|
||||
package main
|
||||
|
||||
@ -90,3 +98,22 @@ func main() {
|
||||
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)
|
||||
runtime·exit(3);
|
||||
}
|
||||
m->dying = 1;
|
||||
if(g != nil)
|
||||
g->writebuf = nil;
|
||||
runtime·xadd(&runtime·panicking, 1);
|
||||
runtime·lock(&paniclk);
|
||||
}
|
||||
|
@ -712,11 +712,18 @@ runtime·newextram(void)
|
||||
gp->sched.sp = gp->stackbase;
|
||||
gp->sched.lr = 0;
|
||||
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;
|
||||
mp->curg = gp;
|
||||
mp->locked = LockInternal;
|
||||
mp->lockedg = gp;
|
||||
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
|
||||
runtime·lock(&runtime·sched);
|
||||
if(runtime·lastg == nil)
|
||||
@ -725,9 +732,6 @@ runtime·newextram(void)
|
||||
runtime·lastg->alllink = gp;
|
||||
runtime·lastg = gp;
|
||||
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.
|
||||
mnext = lockextra(true);
|
||||
|
Loading…
Reference in New Issue
Block a user