1
0
mirror of https://github.com/golang/go synced 2024-11-18 19:54:44 -07:00

runtime: adopt race detector for runtime written in Go

Ignore memory access on g0/gsignal.
See the issue for context and explanation.
Fixes #8627.

LGTM=khr
R=golang-codereviews, mdempsky, khr
CC=golang-codereviews, rsc
https://golang.org/cl/137070043
This commit is contained in:
Dmitriy Vyukov 2014-09-03 20:47:30 +04:00
parent 56bd176e1d
commit 467a6d28be
3 changed files with 18 additions and 10 deletions

View File

@ -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

View File

@ -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;

View File

@ -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);