| // Copyright 2009 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 runtime |
| |
| var ticks struct { |
| lock mutex |
| val uint64 |
| } |
| |
| var tls0 [8]uintptr // available storage for m0's TLS; not necessarily used; opaque to GC |
| |
| // Note: Called by runtime/pprof in addition to runtime code. |
| func tickspersecond() int64 { |
| r := int64(atomicload64(&ticks.val)) |
| if r != 0 { |
| return r |
| } |
| lock(&ticks.lock) |
| r = int64(ticks.val) |
| if r == 0 { |
| t0 := nanotime() |
| c0 := cputicks() |
| usleep(100 * 1000) |
| t1 := nanotime() |
| c1 := cputicks() |
| if t1 == t0 { |
| t1++ |
| } |
| r = (c1 - c0) * 1000 * 1000 * 1000 / (t1 - t0) |
| if r == 0 { |
| r++ |
| } |
| atomicstore64(&ticks.val, uint64(r)) |
| } |
| unlock(&ticks.lock) |
| return r |
| } |
| |
| func makeStringSlice(n int) []string { |
| return make([]string, n) |
| } |
| |
| // TODO: Move to parfor.go when parfor.c becomes parfor.go. |
| func parforalloc(nthrmax uint32) *parfor { |
| return &parfor{ |
| thr: &make([]parforthread, nthrmax)[0], |
| nthrmax: nthrmax, |
| } |
| } |
| |
| var envs []string |
| var argslice []string |
| |
| // called from syscall |
| func runtime_envs() []string { return envs } |
| |
| // called from os |
| func runtime_args() []string { return argslice } |