diff options
| author | Dmitriy Vyukov <dvyukov@google.com> | 2012-11-30 10:29:41 +0400 |
|---|---|---|
| committer | Dmitriy Vyukov <dvyukov@google.com> | 2012-11-30 10:29:41 +0400 |
| commit | 0ce96f9ef4533430634fe4329b640176074ef9c4 (patch) | |
| tree | fbb5d8af81e28fea273b39c772987b790e0e666b /src/pkg/runtime/slice.c | |
| parent | c3c107f67c86e9e0bf03f831be4f9417c75463a4 (diff) | |
| download | go-0ce96f9ef4533430634fe4329b640176074ef9c4.tar.xz | |
runtime: better stack traces in race reports
When a race happens inside of runtime (chan, slice, etc),
currently reports contain only user file:line.
If the line contains a complex expression,
it's difficult to figure out where the race exactly.
This change adds one more top frame with exact
runtime function (e.g. runtime.chansend, runtime.mapaccess).
R=golang-dev
CC=golang-dev
https://golang.org/cl/6851125
Diffstat (limited to 'src/pkg/runtime/slice.c')
| -rw-r--r-- | src/pkg/runtime/slice.c | 18 |
1 files changed, 9 insertions, 9 deletions
diff --git a/src/pkg/runtime/slice.c b/src/pkg/runtime/slice.c index 2f62c4c02d..e2c76eb8e7 100644 --- a/src/pkg/runtime/slice.c +++ b/src/pkg/runtime/slice.c @@ -83,11 +83,11 @@ runtime·appendslice(SliceType *t, Slice x, Slice y, Slice ret) if(raceenabled) { pc = runtime·getcallerpc(&t); for(i=0; i<x.len; i++) - runtime·racereadpc(x.array + i*t->elem->size, pc); + runtime·racereadpc(x.array + i*t->elem->size, pc, runtime·appendslice); for(i=x.len; i<x.cap; i++) - runtime·racewritepc(x.array + i*t->elem->size, pc); + runtime·racewritepc(x.array + i*t->elem->size, pc, runtime·appendslice); for(i=0; i<y.len; i++) - runtime·racereadpc(y.array + i*t->elem->size, pc); + runtime·racereadpc(y.array + i*t->elem->size, pc, runtime·appendslice); } if(m > x.cap) @@ -118,9 +118,9 @@ runtime·appendstr(SliceType *t, Slice x, String y, Slice ret) if(raceenabled) { pc = runtime·getcallerpc(&t); for(i=0; i<x.len; i++) - runtime·racereadpc(x.array + i*t->elem->size, pc); + runtime·racereadpc(x.array + i*t->elem->size, pc, runtime·appendstr); for(i=x.len; i<x.cap; i++) - runtime·racewritepc(x.array + i*t->elem->size, pc); + runtime·racewritepc(x.array + i*t->elem->size, pc, runtime·appendstr); } if(m > x.cap) @@ -153,7 +153,7 @@ runtime·growslice(SliceType *t, Slice old, int64 n, Slice ret) if(raceenabled) { pc = runtime·getcallerpc(&t); for(i=0; i<old.len; i++) - runtime·racewritepc(old.array + i*t->elem->size, pc); + runtime·racewritepc(old.array + i*t->elem->size, pc, runtime·growslice); } growslice1(t, old, cap, &ret); @@ -213,8 +213,8 @@ runtime·copy(Slice to, Slice fm, uintptr width, intgo ret) if(raceenabled) { pc = runtime·getcallerpc(&to); for(i=0; i<ret; i++) { - runtime·racewritepc(to.array + i*width, pc); - runtime·racereadpc(fm.array + i*width, pc); + runtime·racewritepc(to.array + i*width, pc, runtime·copy); + runtime·racereadpc(fm.array + i*width, pc, runtime·copy); } } @@ -259,7 +259,7 @@ runtime·slicestringcopy(Slice to, String fm, intgo ret) if(raceenabled) { pc = runtime·getcallerpc(&to); for(i=0; i<ret; i++) { - runtime·racewritepc(to.array + i, pc); + runtime·racewritepc(to.array + i, pc, runtime·slicestringcopy); } } |
