2010-10-25 18:55:50 -06:00
|
|
|
// Copyright 2010 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.
|
|
|
|
|
|
|
|
// Export guts for testing.
|
|
|
|
|
|
|
|
package runtime
|
|
|
|
|
2014-08-21 11:10:45 -06:00
|
|
|
import "unsafe"
|
|
|
|
|
2010-10-25 18:55:50 -06:00
|
|
|
var Fadd64 = fadd64
|
|
|
|
var Fsub64 = fsub64
|
|
|
|
var Fmul64 = fmul64
|
|
|
|
var Fdiv64 = fdiv64
|
|
|
|
var F64to32 = f64to32
|
|
|
|
var F32to64 = f32to64
|
|
|
|
var Fcmp64 = fcmp64
|
|
|
|
var Fintto64 = fintto64
|
|
|
|
var F64toint = f64toint
|
2011-07-19 09:01:17 -06:00
|
|
|
|
2014-09-06 11:07:23 -06:00
|
|
|
// in asm_*.s
|
2012-03-15 13:22:30 -06:00
|
|
|
func stackguard() (sp, limit uintptr)
|
2011-07-19 09:01:17 -06:00
|
|
|
|
|
|
|
var Entersyscall = entersyscall
|
|
|
|
var Exitsyscall = exitsyscall
|
2014-08-27 21:32:49 -06:00
|
|
|
var LockedOSThread = lockedOSThread
|
2012-04-12 01:49:25 -06:00
|
|
|
|
|
|
|
type LFNode struct {
|
|
|
|
Next *LFNode
|
|
|
|
Pushcnt uintptr
|
|
|
|
}
|
|
|
|
|
2014-09-03 09:35:22 -06:00
|
|
|
func lfstackpush_m()
|
|
|
|
func lfstackpop_m()
|
2014-08-21 11:10:45 -06:00
|
|
|
|
|
|
|
func LFStackPush(head *uint64, node *LFNode) {
|
|
|
|
mp := acquirem()
|
|
|
|
mp.ptrarg[0] = unsafe.Pointer(head)
|
|
|
|
mp.ptrarg[1] = unsafe.Pointer(node)
|
2014-09-03 09:35:22 -06:00
|
|
|
onM(lfstackpush_m)
|
2014-08-21 11:10:45 -06:00
|
|
|
releasem(mp)
|
|
|
|
}
|
2012-04-12 01:49:25 -06:00
|
|
|
|
2014-08-21 11:10:45 -06:00
|
|
|
func LFStackPop(head *uint64) *LFNode {
|
|
|
|
mp := acquirem()
|
|
|
|
mp.ptrarg[0] = unsafe.Pointer(head)
|
2014-09-03 09:35:22 -06:00
|
|
|
onM(lfstackpop_m)
|
2014-08-21 11:10:45 -06:00
|
|
|
node := (*LFNode)(unsafe.Pointer(mp.ptrarg[0]))
|
|
|
|
mp.ptrarg[0] = nil
|
|
|
|
releasem(mp)
|
|
|
|
return node
|
|
|
|
}
|
2012-05-11 00:50:03 -06:00
|
|
|
|
|
|
|
type ParFor struct {
|
|
|
|
body *byte
|
|
|
|
done uint32
|
|
|
|
Nthr uint32
|
|
|
|
nthrmax uint32
|
|
|
|
thrseq uint32
|
|
|
|
Cnt uint32
|
|
|
|
Ctx *byte
|
|
|
|
wait bool
|
|
|
|
}
|
|
|
|
|
2014-09-03 09:35:22 -06:00
|
|
|
func newparfor_m()
|
|
|
|
func parforsetup_m()
|
|
|
|
func parfordo_m()
|
|
|
|
func parforiters_m()
|
2014-08-24 01:47:06 -06:00
|
|
|
|
|
|
|
func NewParFor(nthrmax uint32) *ParFor {
|
|
|
|
mp := acquirem()
|
cmd/cc, runtime: preserve C runtime type names in generated Go
uintptr or uint64 in the runtime C were turning into uint in the Go,
bool was turning into uint8, and so on. Fix that.
Also delete Go wrappers for C functions.
The C functions can be called directly now
(but still eventually need to be converted to Go).
LGTM=bradfitz, minux, iant
R=golang-codereviews, bradfitz, iant, minux
CC=golang-codereviews, khr, r
https://golang.org/cl/138740043
2014-08-27 19:59:49 -06:00
|
|
|
mp.scalararg[0] = uintptr(nthrmax)
|
2014-09-03 09:35:22 -06:00
|
|
|
onM(newparfor_m)
|
2014-08-24 01:47:06 -06:00
|
|
|
desc := (*ParFor)(mp.ptrarg[0])
|
|
|
|
mp.ptrarg[0] = nil
|
|
|
|
releasem(mp)
|
|
|
|
return desc
|
|
|
|
}
|
|
|
|
|
|
|
|
func ParForSetup(desc *ParFor, nthr, n uint32, ctx *byte, wait bool, body func(*ParFor, uint32)) {
|
|
|
|
mp := acquirem()
|
|
|
|
mp.ptrarg[0] = unsafe.Pointer(desc)
|
|
|
|
mp.ptrarg[1] = unsafe.Pointer(ctx)
|
2014-09-03 09:10:38 -06:00
|
|
|
mp.ptrarg[2] = unsafe.Pointer(funcPC(body)) // TODO(rsc): Should be a scalar.
|
cmd/cc, runtime: preserve C runtime type names in generated Go
uintptr or uint64 in the runtime C were turning into uint in the Go,
bool was turning into uint8, and so on. Fix that.
Also delete Go wrappers for C functions.
The C functions can be called directly now
(but still eventually need to be converted to Go).
LGTM=bradfitz, minux, iant
R=golang-codereviews, bradfitz, iant, minux
CC=golang-codereviews, khr, r
https://golang.org/cl/138740043
2014-08-27 19:59:49 -06:00
|
|
|
mp.scalararg[0] = uintptr(nthr)
|
|
|
|
mp.scalararg[1] = uintptr(n)
|
2014-08-24 01:47:06 -06:00
|
|
|
mp.scalararg[2] = 0
|
|
|
|
if wait {
|
|
|
|
mp.scalararg[2] = 1
|
|
|
|
}
|
2014-09-03 09:35:22 -06:00
|
|
|
onM(parforsetup_m)
|
2014-08-24 01:47:06 -06:00
|
|
|
releasem(mp)
|
|
|
|
}
|
2012-05-11 00:50:03 -06:00
|
|
|
|
2014-08-24 01:47:06 -06:00
|
|
|
func ParForDo(desc *ParFor) {
|
|
|
|
mp := acquirem()
|
|
|
|
mp.ptrarg[0] = unsafe.Pointer(desc)
|
2014-09-03 09:35:22 -06:00
|
|
|
onM(parfordo_m)
|
2014-08-24 01:47:06 -06:00
|
|
|
releasem(mp)
|
|
|
|
}
|
2012-05-11 00:50:03 -06:00
|
|
|
|
|
|
|
func ParForIters(desc *ParFor, tid uint32) (uint32, uint32) {
|
2014-08-24 01:47:06 -06:00
|
|
|
mp := acquirem()
|
|
|
|
mp.ptrarg[0] = unsafe.Pointer(desc)
|
cmd/cc, runtime: preserve C runtime type names in generated Go
uintptr or uint64 in the runtime C were turning into uint in the Go,
bool was turning into uint8, and so on. Fix that.
Also delete Go wrappers for C functions.
The C functions can be called directly now
(but still eventually need to be converted to Go).
LGTM=bradfitz, minux, iant
R=golang-codereviews, bradfitz, iant, minux
CC=golang-codereviews, khr, r
https://golang.org/cl/138740043
2014-08-27 19:59:49 -06:00
|
|
|
mp.scalararg[0] = uintptr(tid)
|
2014-09-03 09:35:22 -06:00
|
|
|
onM(parforiters_m)
|
2014-08-24 01:47:06 -06:00
|
|
|
begin := uint32(mp.scalararg[0])
|
|
|
|
end := uint32(mp.scalararg[1])
|
|
|
|
releasem(mp)
|
|
|
|
return begin, end
|
2012-05-11 00:50:03 -06:00
|
|
|
}
|
2013-02-22 21:48:02 -07:00
|
|
|
|
2014-09-05 15:59:31 -06:00
|
|
|
// in mgc0.c
|
2014-07-29 01:01:02 -06:00
|
|
|
//go:noescape
|
2014-09-05 15:59:31 -06:00
|
|
|
func getgcmask(data unsafe.Pointer, typ *_type, array **byte, len *uint)
|
|
|
|
|
|
|
|
func GCMask(x interface{}) (ret []byte) {
|
|
|
|
e := (*eface)(unsafe.Pointer(&x))
|
|
|
|
s := (*slice)(unsafe.Pointer(&ret))
|
|
|
|
onM(func() {
|
|
|
|
getgcmask(e.data, e._type, &s.array, &s.len)
|
|
|
|
s.cap = s.len
|
|
|
|
})
|
|
|
|
return
|
|
|
|
}
|
2014-07-29 01:01:02 -06:00
|
|
|
|
2013-02-22 21:48:02 -07:00
|
|
|
func testSchedLocalQueue()
|
|
|
|
func testSchedLocalQueueSteal()
|
2014-09-06 11:07:23 -06:00
|
|
|
func RunSchedLocalQueueTest() {
|
|
|
|
onM(testSchedLocalQueue)
|
|
|
|
}
|
|
|
|
func RunSchedLocalQueueStealTest() {
|
|
|
|
onM(testSchedLocalQueueSteal)
|
|
|
|
}
|
2013-09-06 17:23:46 -06:00
|
|
|
|
|
|
|
var HaveGoodHash = haveGoodHash
|
|
|
|
var StringHash = stringHash
|
|
|
|
var BytesHash = bytesHash
|
|
|
|
var Int32Hash = int32Hash
|
|
|
|
var Int64Hash = int64Hash
|
2014-08-07 13:33:20 -06:00
|
|
|
var EfaceHash = efaceHash
|
|
|
|
var IfaceHash = ifaceHash
|
2014-08-20 15:02:11 -06:00
|
|
|
var MemclrBytes = memclrBytes
|
2013-09-13 12:19:23 -06:00
|
|
|
|
2013-10-04 14:54:03 -06:00
|
|
|
var HashLoad = &hashLoad
|
2014-02-06 18:43:22 -07:00
|
|
|
|
2014-09-05 16:01:09 -06:00
|
|
|
// For testing.
|
|
|
|
func GogoBytes() int32 {
|
|
|
|
return _RuntimeGogoBytes
|
|
|
|
}
|
2014-06-17 01:36:23 -06:00
|
|
|
|
2014-09-05 16:01:09 -06:00
|
|
|
// in string.c
|
|
|
|
//go:noescape
|
|
|
|
func gostringw(w *uint16) string
|
2014-06-17 01:36:23 -06:00
|
|
|
|
2014-09-05 16:01:09 -06:00
|
|
|
// entry point for testing
|
|
|
|
func GostringW(w []uint16) (s string) {
|
|
|
|
onM(func() {
|
|
|
|
s = gostringw(&w[0])
|
|
|
|
})
|
|
|
|
return
|
|
|
|
}
|
2014-09-11 17:53:34 -06:00
|
|
|
|
|
|
|
var Gostringnocopy = gostringnocopy
|
|
|
|
var Maxstring = &maxstring
|