blob: ceb3326c4f1b7208af3c80dfa8136b943d6e677c [file] [log] [blame]
// Copyright 2022 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 (
"flag"
"os"
_ "unsafe"
)
var modeflag = flag.String("mode", "", "mode to run in")
func main() {
flag.Parse()
switch *modeflag {
case "simple":
testSimple()
case "goodexit":
testGoodExit()
case "badexit":
testBadExit()
case "panics":
testPanics()
case "callsexit":
testHookCallsExit()
default:
panic("unknown mode")
}
}
//go:linkname runtime_addExitHook runtime.addExitHook
func runtime_addExitHook(f func(), runOnNonZeroExit bool)
func testSimple() {
f1 := func() { println("foo") }
f2 := func() { println("bar") }
runtime_addExitHook(f1, false)
runtime_addExitHook(f2, false)
// no explicit call to os.Exit
}
func testGoodExit() {
f1 := func() { println("apple") }
f2 := func() { println("orange") }
runtime_addExitHook(f1, false)
runtime_addExitHook(f2, false)
// explicit call to os.Exit
os.Exit(0)
}
func testBadExit() {
f1 := func() { println("blog") }
f2 := func() { println("blix") }
f3 := func() { println("blek") }
f4 := func() { println("blub") }
f5 := func() { println("blat") }
runtime_addExitHook(f1, false)
runtime_addExitHook(f2, true)
runtime_addExitHook(f3, false)
runtime_addExitHook(f4, true)
runtime_addExitHook(f5, false)
os.Exit(1)
}
func testPanics() {
f1 := func() { println("ok") }
f2 := func() { panic("BADBADBAD") }
f3 := func() { println("good") }
runtime_addExitHook(f1, true)
runtime_addExitHook(f2, true)
runtime_addExitHook(f3, true)
os.Exit(0)
}
func testHookCallsExit() {
f1 := func() { println("ok") }
f2 := func() { os.Exit(1) }
f3 := func() { println("good") }
runtime_addExitHook(f1, true)
runtime_addExitHook(f2, true)
runtime_addExitHook(f3, true)
os.Exit(1)
}