diff options
| author | Austin Clements <austin@google.com> | 2015-11-10 16:43:33 -0500 |
|---|---|---|
| committer | Austin Clements <austin@google.com> | 2015-11-11 17:37:26 +0000 |
| commit | 2be1ed80c509ca9768acf729a4ad541ccb4d3dd0 (patch) | |
| tree | 67cc5b849ed4057b7ee800a5ec81930512d9bdec /src/runtime/trace.go | |
| parent | 03227bb55ec92c9af4dcf55d83ec77b3f1e69aff (diff) | |
| download | go-2be1ed80c509ca9768acf729a4ad541ccb4d3dd0.tar.xz | |
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>
Diffstat (limited to 'src/runtime/trace.go')
| -rw-r--r-- | src/runtime/trace.go | 13 |
1 files changed, 9 insertions, 4 deletions
diff --git a/src/runtime/trace.go b/src/runtime/trace.go index f8e6649ef9..0d3940d327 100644 --- a/src/runtime/trace.go +++ b/src/runtime/trace.go @@ -618,18 +618,22 @@ type traceStackTable struct { lock mutex seq uint32 mem traceAlloc - tab [1 << 13]*traceStack + tab [1 << 13]traceStackPtr } // traceStack is a single stack in traceStackTable. type traceStack struct { - link *traceStack + link traceStackPtr hash uintptr id uint32 n int 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. func (ts *traceStack) stack() []uintptr { 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 { part := int(hash % uintptr(len(tab.tab))) 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) { for i, stkpc := range stk.stack() { if stkpc != pcs[i] { @@ -697,7 +701,8 @@ func (tab *traceStackTable) dump() { var tmp [(2 + traceStackSize) * traceBytesPerNumber]byte buf := traceFlush(0).ptr() 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 if cap(buf.buf)-len(buf.buf) < maxSize { buf = traceFlush(traceBufPtrOf(buf)).ptr() |
