mirror of https://github.com/golang/go.git
runtime: eliminate traceStack write barriers
This replaces *traceStack with traceStackPtr, much like the preceding commit. Updates #10600. Change-Id: Ifadc35eb37a405ae877f9740151fb31a0ca1d08f Reviewed-on: https://go-review.googlesource.com/16813 Run-TryBot: Austin Clements <austin@google.com> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Dmitry Vyukov <dvyukov@google.com>
This commit is contained in:
parent
03227bb55e
commit
2be1ed80c5
|
|
@ -618,18 +618,22 @@ type traceStackTable struct {
|
||||||
lock mutex
|
lock mutex
|
||||||
seq uint32
|
seq uint32
|
||||||
mem traceAlloc
|
mem traceAlloc
|
||||||
tab [1 << 13]*traceStack
|
tab [1 << 13]traceStackPtr
|
||||||
}
|
}
|
||||||
|
|
||||||
// traceStack is a single stack in traceStackTable.
|
// traceStack is a single stack in traceStackTable.
|
||||||
type traceStack struct {
|
type traceStack struct {
|
||||||
link *traceStack
|
link traceStackPtr
|
||||||
hash uintptr
|
hash uintptr
|
||||||
id uint32
|
id uint32
|
||||||
n int
|
n int
|
||||||
stk [0]uintptr // real type [n]uintptr
|
stk [0]uintptr // real type [n]uintptr
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type traceStackPtr uintptr
|
||||||
|
|
||||||
|
func (tp traceStackPtr) ptr() *traceStack { return (*traceStack)(unsafe.Pointer(tp)) }
|
||||||
|
|
||||||
// stack returns slice of PCs.
|
// stack returns slice of PCs.
|
||||||
func (ts *traceStack) stack() []uintptr {
|
func (ts *traceStack) stack() []uintptr {
|
||||||
return (*[traceStackSize]uintptr)(unsafe.Pointer(&ts.stk))[:ts.n]
|
return (*[traceStackSize]uintptr)(unsafe.Pointer(&ts.stk))[:ts.n]
|
||||||
|
|
@ -673,7 +677,7 @@ func (tab *traceStackTable) put(pcs []uintptr) uint32 {
|
||||||
func (tab *traceStackTable) find(pcs []uintptr, hash uintptr) uint32 {
|
func (tab *traceStackTable) find(pcs []uintptr, hash uintptr) uint32 {
|
||||||
part := int(hash % uintptr(len(tab.tab)))
|
part := int(hash % uintptr(len(tab.tab)))
|
||||||
Search:
|
Search:
|
||||||
for stk := tab.tab[part]; stk != nil; stk = stk.link {
|
for stk := tab.tab[part].ptr(); stk != nil; stk = stk.link.ptr() {
|
||||||
if stk.hash == hash && stk.n == len(pcs) {
|
if stk.hash == hash && stk.n == len(pcs) {
|
||||||
for i, stkpc := range stk.stack() {
|
for i, stkpc := range stk.stack() {
|
||||||
if stkpc != pcs[i] {
|
if stkpc != pcs[i] {
|
||||||
|
|
@ -697,7 +701,8 @@ func (tab *traceStackTable) dump() {
|
||||||
var tmp [(2 + traceStackSize) * traceBytesPerNumber]byte
|
var tmp [(2 + traceStackSize) * traceBytesPerNumber]byte
|
||||||
buf := traceFlush(0).ptr()
|
buf := traceFlush(0).ptr()
|
||||||
for _, stk := range tab.tab {
|
for _, stk := range tab.tab {
|
||||||
for ; stk != nil; stk = stk.link {
|
stk := stk.ptr()
|
||||||
|
for ; stk != nil; stk = stk.link.ptr() {
|
||||||
maxSize := 1 + (3+stk.n)*traceBytesPerNumber
|
maxSize := 1 + (3+stk.n)*traceBytesPerNumber
|
||||||
if cap(buf.buf)-len(buf.buf) < maxSize {
|
if cap(buf.buf)-len(buf.buf) < maxSize {
|
||||||
buf = traceFlush(traceBufPtrOf(buf)).ptr()
|
buf = traceFlush(traceBufPtrOf(buf)).ptr()
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue