github.com/mtsmfm/go/src@v0.0.0-20221020090648-44bdcb9f8fde/runtime/runtime.go (about) 1 // Copyright 2009 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 package runtime 6 7 import ( 8 "runtime/internal/atomic" 9 _ "unsafe" // for go:linkname 10 ) 11 12 //go:generate go run wincallback.go 13 //go:generate go run mkduff.go 14 //go:generate go run mkfastlog2table.go 15 //go:generate go run mklockrank.go -o lockrank.go 16 17 var ticks ticksType 18 19 type ticksType struct { 20 lock mutex 21 val atomic.Int64 22 } 23 24 // Note: Called by runtime/pprof in addition to runtime code. 25 func tickspersecond() int64 { 26 r := ticks.val.Load() 27 if r != 0 { 28 return r 29 } 30 lock(&ticks.lock) 31 r = ticks.val.Load() 32 if r == 0 { 33 t0 := nanotime() 34 c0 := cputicks() 35 usleep(100 * 1000) 36 t1 := nanotime() 37 c1 := cputicks() 38 if t1 == t0 { 39 t1++ 40 } 41 r = (c1 - c0) * 1000 * 1000 * 1000 / (t1 - t0) 42 if r == 0 { 43 r++ 44 } 45 ticks.val.Store(r) 46 } 47 unlock(&ticks.lock) 48 return r 49 } 50 51 var envs []string 52 var argslice []string 53 54 //go:linkname syscall_runtime_envs syscall.runtime_envs 55 func syscall_runtime_envs() []string { return append([]string{}, envs...) } 56 57 //go:linkname syscall_Getpagesize syscall.Getpagesize 58 func syscall_Getpagesize() int { return int(physPageSize) } 59 60 //go:linkname os_runtime_args os.runtime_args 61 func os_runtime_args() []string { return append([]string{}, argslice...) } 62 63 //go:linkname syscall_Exit syscall.Exit 64 //go:nosplit 65 func syscall_Exit(code int) { 66 exit(int32(code)) 67 } 68 69 var godebugenv atomic.Pointer[string] // set by parsedebugvars 70 71 //go:linkname godebug_getGODEBUG internal/godebug.getGODEBUG 72 func godebug_getGODEBUG() string { 73 if p := godebugenv.Load(); p != nil { 74 return *p 75 } 76 return "" 77 } 78 79 //go:linkname syscall_runtimeSetenv syscall.runtimeSetenv 80 func syscall_runtimeSetenv(key, value string) { 81 setenv_c(key, value) 82 if key == "GODEBUG" { 83 p := new(string) 84 *p = value 85 godebugenv.Store(p) 86 } 87 } 88 89 //go:linkname syscall_runtimeUnsetenv syscall.runtimeUnsetenv 90 func syscall_runtimeUnsetenv(key string) { 91 unsetenv_c(key) 92 if key == "GODEBUG" { 93 godebugenv.Store(nil) 94 } 95 }