github.com/reiver/go@v0.0.0-20150109200633-1d0c7792f172/src/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 _ "unsafe" // for go:linkname
     8  
     9  //go:generate go run wincallback.go
    10  
    11  var ticks struct {
    12  	lock mutex
    13  	val  uint64
    14  }
    15  
    16  var tls0 [8]uintptr // available storage for m0's TLS; not necessarily used; opaque to GC
    17  
    18  // Note: Called by runtime/pprof in addition to runtime code.
    19  func tickspersecond() int64 {
    20  	r := int64(atomicload64(&ticks.val))
    21  	if r != 0 {
    22  		return r
    23  	}
    24  	lock(&ticks.lock)
    25  	r = int64(ticks.val)
    26  	if r == 0 {
    27  		t0 := nanotime()
    28  		c0 := cputicks()
    29  		usleep(100 * 1000)
    30  		t1 := nanotime()
    31  		c1 := cputicks()
    32  		if t1 == t0 {
    33  			t1++
    34  		}
    35  		r = (c1 - c0) * 1000 * 1000 * 1000 / (t1 - t0)
    36  		if r == 0 {
    37  			r++
    38  		}
    39  		atomicstore64(&ticks.val, uint64(r))
    40  	}
    41  	unlock(&ticks.lock)
    42  	return r
    43  }
    44  
    45  func makeStringSlice(n int) []string {
    46  	return make([]string, n)
    47  }
    48  
    49  // TODO: Move to parfor.go when parfor.c becomes parfor.go.
    50  func parforalloc(nthrmax uint32) *parfor {
    51  	return &parfor{
    52  		thr:     &make([]parforthread, nthrmax)[0],
    53  		nthrmax: nthrmax,
    54  	}
    55  }
    56  
    57  var envs []string
    58  var argslice []string
    59  
    60  //go:linkname syscall_runtime_envs syscall.runtime_envs
    61  func syscall_runtime_envs() []string { return envs }
    62  
    63  //go:linkname os_runtime_args os.runtime_args
    64  func os_runtime_args() []string { return argslice }