Commit a282a875 by Ian Lance Taylor

runtime: ignore _Gscan bit when checking status in CgocallDone

    
    Also always access the atomicstatus field atomically.
    
    The effect of not checking the _Gscan bit is that if the GC decides to
    scan the stack just as the goroutine is leaving the system call, the
    goroutine might fail to call exitsyscall.  Then then typically causes
    a runtime assertion failure later on.  If we do call exitsyscall as we
    should, it will stall (in casgstatus) until the _Gscan bit is cleared.
    
    No separate test.  I've observed causing sporadic failures running the
    misc/cgo tests, but we don't currently have a way to run those
    routinely for gccgo.  I should fix that.
    
    Reviewed-on: https://go-review.googlesource.com/45392

From-SVN: r249138
parent b51483f4
61222d34c1b33a369bd86008a0541455dd17727e
908fc7e46ebe36658ed86b65a3d165fccb2e8576
The first line of this file holds the git revision number of the last
merge done from the gofrontend repository.
......@@ -54,7 +54,7 @@ func CgocallDone() {
// If we are invoked because the C function called _cgo_panic,
// then _cgo_panic will already have exited syscall mode.
if gp.atomicstatus == _Gsyscall {
if readgstatus(gp)&^_Gscan == _Gsyscall {
exitsyscall(0)
}
......
......@@ -1459,7 +1459,7 @@ func dropm() {
// gccgo sets the stack to Gdead here, because the splitstack
// context is not initialized.
mp.curg.atomicstatus = _Gdead
atomic.Store(&mp.curg.atomicstatus, _Gdead)
mp.curg.gcstack = nil
mp.curg.gcnextsp = nil
......
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