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
5package runtime
6
7import (
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
16var ticks struct {
17	lock mutex
18	pad  uint32 // ensure 8-byte alignment of val on 386
19	val  uint64
20}
21
22// Note: Called by runtime/pprof in addition to runtime code.
23func tickspersecond() int64 {
24	r := int64(atomic.Load64(&ticks.val))
25	if r != 0 {
26		return r
27	}
28	lock(&ticks.lock)
29	r = int64(ticks.val)
30	if r == 0 {
31		t0 := nanotime()
32		c0 := cputicks()
33		usleep(100 * 1000)
34		t1 := nanotime()
35		c1 := cputicks()
36		if t1 == t0 {
37			t1++
38		}
39		r = (c1 - c0) * 1000 * 1000 * 1000 / (t1 - t0)
40		if r == 0 {
41			r++
42		}
43		atomic.Store64(&ticks.val, uint64(r))
44	}
45	unlock(&ticks.lock)
46	return r
47}
48
49var envs []string
50var argslice []string
51
52//go:linkname syscall_runtime_envs syscall.runtime_envs
53func syscall_runtime_envs() []string { return append([]string{}, envs...) }
54
55//go:linkname syscall_Getpagesize syscall.Getpagesize
56func syscall_Getpagesize() int { return int(physPageSize) }
57
58//go:linkname os_runtime_args os.runtime_args
59func os_runtime_args() []string { return append([]string{}, argslice...) }
60
61//go:linkname syscall_Exit syscall.Exit
62//go:nosplit
63func syscall_Exit(code int) {
64	exit(int32(code))
65}
66