github.com/x04/go/src@v0.0.0-20200202162449-3d481ceb3525/runtime/testdata/testprog/vdso.go (about) 1 // Copyright 2019 The Go Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 // Invoke signal hander in the VDSO context (see issue 32912). 6 7 package main 8 9 import ( 10 "github.com/x04/go/src/fmt" 11 "github.com/x04/go/src/io/ioutil" 12 "github.com/x04/go/src/os" 13 "github.com/x04/go/src/runtime/pprof" 14 "github.com/x04/go/src/time" 15 ) 16 17 func init() { 18 register("SignalInVDSO", signalInVDSO) 19 } 20 21 func signalInVDSO() { 22 f, err := ioutil.TempFile("", "timeprofnow") 23 if err != nil { 24 fmt.Fprintln(os.Stderr, err) 25 os.Exit(2) 26 } 27 28 if err := pprof.StartCPUProfile(f); err != nil { 29 fmt.Fprintln(os.Stderr, err) 30 os.Exit(2) 31 } 32 33 t0 := time.Now() 34 t1 := t0 35 // We should get a profiling signal 100 times a second, 36 // so running for 1 second should be sufficient. 37 for t1.Sub(t0) < time.Second { 38 t1 = time.Now() 39 } 40 41 pprof.StopCPUProfile() 42 43 name := f.Name() 44 if err := f.Close(); err != nil { 45 fmt.Fprintln(os.Stderr, err) 46 os.Exit(2) 47 } 48 49 if err := os.Remove(name); err != nil { 50 fmt.Fprintln(os.Stderr, err) 51 os.Exit(2) 52 } 53 54 fmt.Println("success") 55 }