mirror of https://github.com/golang/go.git
runtime: clear preemptStop in dropm
Updates #10958 Updates #24543 Fixes #35294 Change-Id: I60f024d08451565df6d9751dab9832b50cbf637a Reviewed-on: https://go-review.googlesource.com/c/go/+/204957 Run-TryBot: Ian Lance Taylor <iant@golang.org> Reviewed-by: Cherry Zhang <cherryyz@google.com>
This commit is contained in:
parent
971ec8728e
commit
8de0bb77eb
|
|
@ -813,3 +813,52 @@ func TestCachedInstall(t *testing.T) {
|
||||||
t.Errorf("p.h not installed in second run: %v", err)
|
t.Errorf("p.h not installed in second run: %v", err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Issue 35294.
|
||||||
|
func TestManyCalls(t *testing.T) {
|
||||||
|
t.Parallel()
|
||||||
|
|
||||||
|
defer func() {
|
||||||
|
os.Remove("testp7" + exeSuffix)
|
||||||
|
os.Remove("libgo7.a")
|
||||||
|
os.Remove("libgo7.h")
|
||||||
|
}()
|
||||||
|
|
||||||
|
cmd := exec.Command("go", "build", "-buildmode=c-archive", "-o", "libgo7.a", "./libgo7")
|
||||||
|
if out, err := cmd.CombinedOutput(); err != nil {
|
||||||
|
t.Logf("%s", out)
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
checkLineComments(t, "libgo7.h")
|
||||||
|
|
||||||
|
ccArgs := append(cc, "-o", "testp7"+exeSuffix, "main7.c", "libgo7.a")
|
||||||
|
if runtime.Compiler == "gccgo" {
|
||||||
|
ccArgs = append(ccArgs, "-lgo")
|
||||||
|
}
|
||||||
|
if out, err := exec.Command(ccArgs[0], ccArgs[1:]...).CombinedOutput(); err != nil {
|
||||||
|
t.Logf("%s", out)
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
argv := cmdToRun("./testp7")
|
||||||
|
cmd = exec.Command(argv[0], argv[1:]...)
|
||||||
|
var sb strings.Builder
|
||||||
|
cmd.Stdout = &sb
|
||||||
|
cmd.Stderr = &sb
|
||||||
|
if err := cmd.Start(); err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
timer := time.AfterFunc(time.Minute,
|
||||||
|
func() {
|
||||||
|
t.Error("test program timed out")
|
||||||
|
cmd.Process.Kill()
|
||||||
|
},
|
||||||
|
)
|
||||||
|
defer timer.Stop()
|
||||||
|
|
||||||
|
if err := cmd.Wait(); err != nil {
|
||||||
|
t.Log(sb.String())
|
||||||
|
t.Error(err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,17 @@
|
||||||
|
// Copyright 2019 The Go Authors. All rights reserved.
|
||||||
|
// Use of this source code is governed by a BSD-style
|
||||||
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
package main
|
||||||
|
|
||||||
|
import "C"
|
||||||
|
|
||||||
|
var sink []byte
|
||||||
|
|
||||||
|
//export GoFunction7
|
||||||
|
func GoFunction7() {
|
||||||
|
sink = make([]byte, 4096)
|
||||||
|
}
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,17 @@
|
||||||
|
// Copyright 2019 The Go Authors. All rights reserved.
|
||||||
|
// Use of this source code is governed by a BSD-style
|
||||||
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
// Test that lots of calls don't deadlock.
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
#include "libgo7.h"
|
||||||
|
|
||||||
|
int main() {
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i = 0; i < 100000; i++) {
|
||||||
|
GoFunction7();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -1625,6 +1625,7 @@ func dropm() {
|
||||||
|
|
||||||
// Return mp.curg to dead state.
|
// Return mp.curg to dead state.
|
||||||
casgstatus(mp.curg, _Gsyscall, _Gdead)
|
casgstatus(mp.curg, _Gsyscall, _Gdead)
|
||||||
|
mp.curg.preemptStop = false
|
||||||
atomic.Xadd(&sched.ngsys, +1)
|
atomic.Xadd(&sched.ngsys, +1)
|
||||||
|
|
||||||
// Block signals before unminit.
|
// Block signals before unminit.
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue