mirror of https://github.com/golang/go.git
runtime: add threadprof tag for test that starts busy thread
The CgoExternalThreadSIGPROF test starts a thread at constructor time that does a busy loop. That can throw off some other tests. So only build that code if testprogcgo is built with the tag threadprof, and adjust the tests that use that code to pass that build tag. This revealed that the CgoPprofThread test was not testing what it should have, as it never actually started the cpuHog thread. It was passing because of the busy loop thread. Fix it to start the thread as intended. Change-Id: I087a9e4fc734a86be16a287456441afac5676beb Reviewed-on: https://go-review.googlesource.com/30362 Run-TryBot: Ian Lance Taylor <iant@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
This commit is contained in:
parent
5fd6bb4c14
commit
e5421e21ef
|
|
@ -100,9 +100,18 @@ func TestCgoExternalThreadSIGPROF(t *testing.T) {
|
|||
// ppc64 (issue #8912)
|
||||
t.Skipf("no external linking on ppc64")
|
||||
}
|
||||
got := runTestProg(t, "testprogcgo", "CgoExternalThreadSIGPROF")
|
||||
want := "OK\n"
|
||||
if got != want {
|
||||
|
||||
exe, err := buildTestProg(t, "testprogcgo", "-tags=threadprof")
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
got, err := testEnv(exec.Command(exe, "CgoExternalThreadSIGPROF")).CombinedOutput()
|
||||
if err != nil {
|
||||
t.Fatalf("exit status: %v\n%s", err, got)
|
||||
}
|
||||
|
||||
if want := "OK\n"; string(got) != want {
|
||||
t.Fatalf("expected %q, but got:\n%s", want, got)
|
||||
}
|
||||
}
|
||||
|
|
@ -113,9 +122,19 @@ func TestCgoExternalThreadSignal(t *testing.T) {
|
|||
case "plan9", "windows":
|
||||
t.Skipf("no pthreads on %s", runtime.GOOS)
|
||||
}
|
||||
got := runTestProg(t, "testprogcgo", "CgoExternalThreadSignal")
|
||||
want := "OK\n"
|
||||
if got != want {
|
||||
|
||||
exe, err := buildTestProg(t, "testprogcgo", "-tags=threadprof")
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
got, err := testEnv(exec.Command(exe, "CgoExternalThreadSIGPROF")).CombinedOutput()
|
||||
if err != nil {
|
||||
t.Fatalf("exit status: %v\n%s", err, got)
|
||||
}
|
||||
|
||||
want := []byte("OK\n")
|
||||
if !bytes.Equal(got, want) {
|
||||
t.Fatalf("expected %q, but got:\n%s", want, got)
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -53,6 +53,18 @@ void pprofCgoThreadTraceback(void* parg) {
|
|||
int getCPUHogThreadCount() {
|
||||
return __sync_add_and_fetch(&cpuHogThreadCount, 0);
|
||||
}
|
||||
|
||||
static void* cpuHogDriver(void* arg __attribute__ ((unused))) {
|
||||
while (1) {
|
||||
cpuHogThread();
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
void runCPUHogThread() {
|
||||
pthread_t tid;
|
||||
pthread_create(&tid, 0, cpuHogDriver, 0);
|
||||
}
|
||||
*/
|
||||
import "C"
|
||||
|
||||
|
|
@ -84,6 +96,8 @@ func CgoPprofThread() {
|
|||
os.Exit(2)
|
||||
}
|
||||
|
||||
C.runCPUHogThread()
|
||||
|
||||
t0 := time.Now()
|
||||
for C.getCPUHogThreadCount() < 2 && time.Since(t0) < time.Second {
|
||||
time.Sleep(100 * time.Millisecond)
|
||||
|
|
|
|||
|
|
@ -2,7 +2,11 @@
|
|||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
// We only build this file with the tag "threadprof", since it starts
|
||||
// a thread running a busy loop at constructor time.
|
||||
|
||||
// +build !plan9,!windows
|
||||
// +build threadprof
|
||||
|
||||
package main
|
||||
|
||||
|
|
@ -21,6 +25,7 @@ static void *thread1(void *p) {
|
|||
spinlock = 0;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
__attribute__((constructor)) void issue9456() {
|
||||
pthread_t tid;
|
||||
pthread_create(&tid, 0, thread1, NULL);
|
||||
|
|
|
|||
Loading…
Reference in New Issue