summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorDmitriy Vyukov <dvyukov@google.com>2014-09-03 20:47:30 +0400
committerDmitriy Vyukov <dvyukov@google.com>2014-09-03 20:47:30 +0400
commit7b20cd40e5da2f97b136ff0e6193b08ef0d7085b (patch)
treeaa8443c2d1f827c99c1338a93bc2b41d05554466 /src
parent548977c7411fb5511eb315420d24fdd0f72ed7a3 (diff)
downloadgo-7b20cd40e5da2f97b136ff0e6193b08ef0d7085b.tar.gz
runtime: adopt race detector for runtime written in Go
Ignore memory access on g0/gsignal. See the issue for context and explanation. Fixes issue 8627. LGTM=khr R=golang-codereviews, mdempsky, khr CC=golang-codereviews, rsc https://codereview.appspot.com/137070043
Diffstat (limited to 'src')
-rw-r--r--src/pkg/runtime/cpuprof.go10
-rw-r--r--src/pkg/runtime/proc.c8
-rw-r--r--src/pkg/runtime/race.c10
3 files changed, 18 insertions, 10 deletions
diff --git a/src/pkg/runtime/cpuprof.go b/src/pkg/runtime/cpuprof.go
index b397eafbe..4325d7e1c 100644
--- a/src/pkg/runtime/cpuprof.go
+++ b/src/pkg/runtime/cpuprof.go
@@ -239,9 +239,7 @@ Assoc:
// Reuse the newly evicted entry.
e.depth = uintptr(len(pc))
e.count = 1
- for i := range pc {
- e.stack[i] = pc[i]
- }
+ copy(e.stack[:], pc)
}
// evict copies the given entry's data into the log, so that
@@ -266,10 +264,8 @@ func (p *cpuProfile) evict(e *cpuprofEntry) bool {
q++
log[q] = d
q++
- for i := uintptr(0); i < d; i++ {
- log[q] = e.stack[i]
- q++
- }
+ copy(log[q:], e.stack[:d])
+ q += d
p.nlog = q
e.count = 0
return true
diff --git a/src/pkg/runtime/proc.c b/src/pkg/runtime/proc.c
index 53d3d23d1..b159215d1 100644
--- a/src/pkg/runtime/proc.c
+++ b/src/pkg/runtime/proc.c
@@ -214,7 +214,11 @@ void
runtime·main(void)
{
Defer d;
-
+
+ // Racectx of m0->g0 is used only as the parent of the main goroutine.
+ // It must not be used for anything else.
+ g->m->g0->racectx = 0;
+
// Max stack size is 1 GB on 64-bit, 250 MB on 32-bit.
// Using decimal instead of binary GB and MB because
// they look nicer in the stack overflow failure message.
@@ -1166,8 +1170,6 @@ newm(void(*fn)(void), P *p)
mp = runtime·allocm(p);
mp->nextp = p;
mp->mstartfn = fn;
- if(raceenabled)
- mp->g0->racectx = runtime·racegostart(newm);
if(runtime·iscgo) {
CgoThreadStart ts;
diff --git a/src/pkg/runtime/race.c b/src/pkg/runtime/race.c
index a773addb0..d5e77c756 100644
--- a/src/pkg/runtime/race.c
+++ b/src/pkg/runtime/race.c
@@ -153,6 +153,11 @@ runtime·racegoend(void)
void
runtime·racewriterangepc(void *addr, uintptr sz, void *callpc, void *pc)
{
+ if(g != g->m->curg) {
+ // The call is coming from manual instrumentation of Go code running on g0/gsignal.
+ // Not interesting.
+ return;
+ }
if(callpc != nil)
runtime·racefuncenter(callpc);
runtime·racewriterangepc1(addr, sz, pc);
@@ -163,6 +168,11 @@ runtime·racewriterangepc(void *addr, uintptr sz, void *callpc, void *pc)
void
runtime·racereadrangepc(void *addr, uintptr sz, void *callpc, void *pc)
{
+ if(g != g->m->curg) {
+ // The call is coming from manual instrumentation of Go code running on g0/gsignal.
+ // Not interesting.
+ return;
+ }
if(callpc != nil)
runtime·racefuncenter(callpc);
runtime·racereadrangepc1(addr, sz, pc);