| // Copyright 2023 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. |
| |
| //go:build unix && !android && !openbsd |
| |
| package main |
| |
| /* |
| void callStackSwitchCallbackFromThread(void); |
| */ |
| import "C" |
| |
| import ( |
| "fmt" |
| "runtime/debug" |
| ) |
| |
| func init() { |
| register("StackSwitchCallback", StackSwitchCallback) |
| } |
| |
| //export stackSwitchCallback |
| func stackSwitchCallback() { |
| // We want to trigger a bounds check on the g0 stack. To do this, we |
| // need to call a splittable function through systemstack(). |
| // SetGCPercent contains such a systemstack call. |
| gogc := debug.SetGCPercent(100) |
| debug.SetGCPercent(gogc) |
| } |
| |
| // Regression test for https://go.dev/issue/62440. It should be possible for C |
| // threads to call into Go from different stacks without crashing due to g0 |
| // stack bounds checks. |
| // |
| // N.B. This is only OK for threads created in C. Threads with Go frames up the |
| // stack must not change the stack out from under us. |
| func StackSwitchCallback() { |
| C.callStackSwitchCallbackFromThread() |
| |
| fmt.Printf("OK\n") |
| } |