| // 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) |
| } |