aboutsummaryrefslogtreecommitdiff
path: root/src/runtime/trace.go
diff options
context:
space:
mode:
authorAustin Clements <austin@google.com>2015-11-10 16:43:33 -0500
committerAustin Clements <austin@google.com>2015-11-11 17:37:26 +0000
commit2be1ed80c509ca9768acf729a4ad541ccb4d3dd0 (patch)
tree67cc5b849ed4057b7ee800a5ec81930512d9bdec /src/runtime/trace.go
parent03227bb55ec92c9af4dcf55d83ec77b3f1e69aff (diff)
downloadgo-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.go13
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()