blob: 2387d9ae8baf67520bf2385f1e4a999d66894c5b [file] [log] [blame]
Russ Coxe3edfea2014-09-04 00:54:06 -04001// 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
Russ Cox7a524a12014-12-22 13:27:53 -05007import _ "unsafe" // for go:linkname
8
Russ Coxdcb2ec32014-12-05 16:24:20 -05009//go:generate go run wincallback.go
Josh Bleecher Snyderad360092015-03-31 09:19:10 -070010//go:generate go run mkduff.go
Russ Coxdcb2ec32014-12-05 16:24:20 -050011
Russ Coxe3edfea2014-09-04 00:54:06 -040012var ticks struct {
13 lock mutex
Austin Clements7a717262015-01-29 11:54:45 -050014 pad uint32 // ensure 8-byte alignment of val on 386
Russ Coxe3edfea2014-09-04 00:54:06 -040015 val uint64
16}
17
Russ Cox193daab2014-09-24 16:55:26 -040018var tls0 [8]uintptr // available storage for m0's TLS; not necessarily used; opaque to GC
19
Russ Coxe3edfea2014-09-04 00:54:06 -040020// Note: Called by runtime/pprof in addition to runtime code.
21func tickspersecond() int64 {
22 r := int64(atomicload64(&ticks.val))
23 if r != 0 {
24 return r
25 }
26 lock(&ticks.lock)
27 r = int64(ticks.val)
28 if r == 0 {
29 t0 := nanotime()
30 c0 := cputicks()
31 usleep(100 * 1000)
32 t1 := nanotime()
33 c1 := cputicks()
34 if t1 == t0 {
35 t1++
36 }
37 r = (c1 - c0) * 1000 * 1000 * 1000 / (t1 - t0)
38 if r == 0 {
39 r++
40 }
41 atomicstore64(&ticks.val, uint64(r))
42 }
43 unlock(&ticks.lock)
44 return r
45}
Russ Cox44753472014-09-12 16:12:39 -040046
Russ Cox193daab2014-09-24 16:55:26 -040047var envs []string
48var argslice []string
49
Russ Cox7a524a12014-12-22 13:27:53 -050050//go:linkname syscall_runtime_envs syscall.runtime_envs
David Crawshaw402f71a2015-03-03 13:55:22 -050051func syscall_runtime_envs() []string { return append([]string{}, envs...) }
Russ Cox193daab2014-09-24 16:55:26 -040052
Russ Cox7a524a12014-12-22 13:27:53 -050053//go:linkname os_runtime_args os.runtime_args
David Crawshaw402f71a2015-03-03 13:55:22 -050054func os_runtime_args() []string { return append([]string{}, argslice...) }