github.com/mdempsky/go@v0.0.0-20151201204031-5dd372bd1e70/src/runtime/export_test.go (about)

     1  // Copyright 2010 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  // Export guts for testing.
     6  
     7  package runtime
     8  
     9  import (
    10  	"runtime/internal/atomic"
    11  	"runtime/internal/sys"
    12  	"unsafe"
    13  )
    14  
    15  var Fadd64 = fadd64
    16  var Fsub64 = fsub64
    17  var Fmul64 = fmul64
    18  var Fdiv64 = fdiv64
    19  var F64to32 = f64to32
    20  var F32to64 = f32to64
    21  var Fcmp64 = fcmp64
    22  var Fintto64 = fintto64
    23  var F64toint = f64toint
    24  var Sqrt = sqrt
    25  
    26  var Entersyscall = entersyscall
    27  var Exitsyscall = exitsyscall
    28  var LockedOSThread = lockedOSThread
    29  var Xadduintptr = atomic.Xadduintptr
    30  
    31  var FuncPC = funcPC
    32  
    33  var Fastlog2 = fastlog2
    34  
    35  type LFNode struct {
    36  	Next    uint64
    37  	Pushcnt uintptr
    38  }
    39  
    40  func LFStackPush(head *uint64, node *LFNode) {
    41  	lfstackpush(head, (*lfnode)(unsafe.Pointer(node)))
    42  }
    43  
    44  func LFStackPop(head *uint64) *LFNode {
    45  	return (*LFNode)(unsafe.Pointer(lfstackpop(head)))
    46  }
    47  
    48  type ParFor struct {
    49  	body   func(*ParFor, uint32)
    50  	done   uint32
    51  	Nthr   uint32
    52  	thrseq uint32
    53  	Cnt    uint32
    54  	wait   bool
    55  }
    56  
    57  func NewParFor(nthrmax uint32) *ParFor {
    58  	var desc *ParFor
    59  	systemstack(func() {
    60  		desc = (*ParFor)(unsafe.Pointer(parforalloc(nthrmax)))
    61  	})
    62  	return desc
    63  }
    64  
    65  func ParForSetup(desc *ParFor, nthr, n uint32, wait bool, body func(*ParFor, uint32)) {
    66  	systemstack(func() {
    67  		parforsetup((*parfor)(unsafe.Pointer(desc)), nthr, n, wait,
    68  			*(*func(*parfor, uint32))(unsafe.Pointer(&body)))
    69  	})
    70  }
    71  
    72  func ParForDo(desc *ParFor) {
    73  	systemstack(func() {
    74  		parfordo((*parfor)(unsafe.Pointer(desc)))
    75  	})
    76  }
    77  
    78  func ParForIters(desc *ParFor, tid uint32) (uint32, uint32) {
    79  	desc1 := (*parfor)(unsafe.Pointer(desc))
    80  	pos := desc1.thr[tid].pos
    81  	return uint32(pos), uint32(pos >> 32)
    82  }
    83  
    84  func GCMask(x interface{}) (ret []byte) {
    85  	systemstack(func() {
    86  		ret = getgcmask(x)
    87  	})
    88  	return
    89  }
    90  
    91  func RunSchedLocalQueueTest() {
    92  	testSchedLocalQueue()
    93  }
    94  func RunSchedLocalQueueStealTest() {
    95  	testSchedLocalQueueSteal()
    96  }
    97  
    98  var StringHash = stringHash
    99  var BytesHash = bytesHash
   100  var Int32Hash = int32Hash
   101  var Int64Hash = int64Hash
   102  var EfaceHash = efaceHash
   103  var IfaceHash = ifaceHash
   104  var MemclrBytes = memclrBytes
   105  
   106  var HashLoad = &hashLoad
   107  
   108  // entry point for testing
   109  func GostringW(w []uint16) (s string) {
   110  	systemstack(func() {
   111  		s = gostringw(&w[0])
   112  	})
   113  	return
   114  }
   115  
   116  var Gostringnocopy = gostringnocopy
   117  var Maxstring = &maxstring
   118  
   119  type Uintreg sys.Uintreg
   120  
   121  var Open = open
   122  var Close = closefd
   123  var Read = read
   124  var Write = write
   125  
   126  func Envs() []string     { return envs }
   127  func SetEnvs(e []string) { envs = e }
   128  
   129  var BigEndian = sys.BigEndian
   130  
   131  // For benchmarking.
   132  
   133  func BenchSetType(n int, x interface{}) {
   134  	e := *efaceOf(&x)
   135  	t := e._type
   136  	var size uintptr
   137  	var p unsafe.Pointer
   138  	switch t.kind & kindMask {
   139  	case kindPtr:
   140  		t = (*ptrtype)(unsafe.Pointer(t)).elem
   141  		size = t.size
   142  		p = e.data
   143  	case kindSlice:
   144  		slice := *(*struct {
   145  			ptr      unsafe.Pointer
   146  			len, cap uintptr
   147  		})(e.data)
   148  		t = (*slicetype)(unsafe.Pointer(t)).elem
   149  		size = t.size * slice.len
   150  		p = slice.ptr
   151  	}
   152  	allocSize := roundupsize(size)
   153  	systemstack(func() {
   154  		for i := 0; i < n; i++ {
   155  			heapBitsSetType(uintptr(p), allocSize, size, t)
   156  		}
   157  	})
   158  }
   159  
   160  const PtrSize = sys.PtrSize
   161  
   162  var TestingAssertE2I2GC = &testingAssertE2I2GC
   163  var TestingAssertE2T2GC = &testingAssertE2T2GC
   164  
   165  var ForceGCPeriod = &forcegcperiod