Commit 2be1ed80 authored by Austin Clements's avatar Austin Clements

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: 's avatarDmitry Vyukov <dvyukov@google.com>
parent 03227bb5
...@@ -618,18 +618,22 @@ type traceStackTable struct { ...@@ -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 { ...@@ -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() { ...@@ -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()
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment