mirror of
https://github.com/golang/go
synced 2024-11-17 05:54:46 -07:00
b079640404
When we were first introducing module mode, CL 163418 moved many of the tests in misc/cgo/test into their own test binary under testdata so misc/cgo/test continued to work in both GOPATH mode and module mode. This introduce a somewhat complicated test driver into misc/cgo/test. Since the misc/cgo/test test had to invoke "go test" as a subprocess, this required care to thread any build flags down into the subprocess. The output from any failures of the sub-process was also less than ideal. Now that we don't have to worry about running these in GOPATH mode any more, this CL moves all of the tests back into misc/cgo/test and drops the test driver. There are two slight complications: - Test41761 was added after this split and has a C type "S" that's also present in misc/cgo/test itself. We rename that to keep that test working. - TestCgo in go/internal/srcimporter now fails to import misc/cgo/test because misc/cgo/test now contains imports of other "misc" module packages and the importer it sets up isn't configured to allow that. We fix this by setting up a build context that's configured for this. Preparation for #37486. Change-Id: I3c4f73540e0482bbd493823cca44b0ce7fac01f3 Reviewed-on: https://go-review.googlesource.com/c/go/+/447355 Reviewed-by: Bryan Mills <bcmills@google.com> Run-TryBot: Austin Clements <austin@google.com> TryBot-Result: Gopher Robot <gobot@golang.org>
68 lines
1.7 KiB
Go
68 lines
1.7 KiB
Go
// Copyright 2014 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 SIGSETXID runs on signal stack, since it's likely to
|
|
// overflow if it runs on the Go stack.
|
|
|
|
package cgotest
|
|
|
|
/*
|
|
#include <sys/types.h>
|
|
#include <unistd.h>
|
|
*/
|
|
import "C"
|
|
|
|
import (
|
|
"runtime"
|
|
"runtime/debug"
|
|
"sync/atomic"
|
|
"testing"
|
|
|
|
"misc/cgo/test/issue9400"
|
|
)
|
|
|
|
func test9400(t *testing.T) {
|
|
// We synchronize through a shared variable, so we need two procs
|
|
defer runtime.GOMAXPROCS(runtime.GOMAXPROCS(2))
|
|
|
|
// Start signaller
|
|
atomic.StoreInt32(&issue9400.Baton, 0)
|
|
go func() {
|
|
// Wait for RewindAndSetgid
|
|
for atomic.LoadInt32(&issue9400.Baton) == 0 {
|
|
runtime.Gosched()
|
|
}
|
|
// Broadcast SIGSETXID
|
|
runtime.LockOSThread()
|
|
C.setgid(0)
|
|
// Indicate that signalling is done
|
|
atomic.StoreInt32(&issue9400.Baton, 0)
|
|
}()
|
|
|
|
// Grow the stack and put down a test pattern
|
|
const pattern = 0x123456789abcdef
|
|
var big [1024]uint64 // len must match assembly
|
|
for i := range big {
|
|
big[i] = pattern
|
|
}
|
|
|
|
// Disable GC for the duration of the test.
|
|
// This avoids a potential GC deadlock when spinning in uninterruptable ASM below #49695.
|
|
defer debug.SetGCPercent(debug.SetGCPercent(-1))
|
|
// SetGCPercent waits until the mark phase is over, but the runtime
|
|
// also preempts at the start of the sweep phase, so make sure that's
|
|
// done too. See #49695.
|
|
runtime.GC()
|
|
|
|
// Temporarily rewind the stack and trigger SIGSETXID
|
|
issue9400.RewindAndSetgid()
|
|
|
|
// Check test pattern
|
|
for i := range big {
|
|
if big[i] != pattern {
|
|
t.Fatalf("entry %d of test pattern is wrong; %#x != %#x", i, big[i], uint64(pattern))
|
|
}
|
|
}
|
|
}
|