From 2f6cbc74f18542b0f79374a2210e420b9500218f Mon Sep 17 00:00:00 2001 From: Dmitriy Vyukov Date: Sun, 7 Oct 2012 22:05:32 +0400 Subject: [PATCH] race: runtime changes This is a part of a bigger change that adds data race detection feature: https://golang.org/cl/6456044 R=rsc CC=gobot, golang-dev https://golang.org/cl/6535050 --- src/pkg/runtime/cgocall.c | 24 ++ src/pkg/runtime/chan.c | 53 +++- src/pkg/runtime/hashmap.c | 25 +- src/pkg/runtime/malloc.goc | 19 +- src/pkg/runtime/mgc0.c | 4 + src/pkg/runtime/proc.c | 16 +- src/pkg/runtime/race.c | 255 ++++++++++++++++++++ src/pkg/runtime/race.go | 26 ++ src/pkg/runtime/race.h | 30 +++ src/pkg/runtime/race/race.go | 105 ++++++++ src/pkg/runtime/race/race_darwin_amd64.syso | Bin 0 -> 144548 bytes src/pkg/runtime/race/race_linux_amd64.syso | Bin 0 -> 141800 bytes src/pkg/runtime/race0.c | 103 ++++++++ src/pkg/runtime/runtime.h | 5 +- src/pkg/runtime/slice.c | 56 ++++- src/pkg/runtime/time.goc | 5 + 16 files changed, 714 insertions(+), 12 deletions(-) create mode 100644 src/pkg/runtime/race.c create mode 100644 src/pkg/runtime/race.go create mode 100644 src/pkg/runtime/race.h create mode 100644 src/pkg/runtime/race/race.go create mode 100644 src/pkg/runtime/race/race_darwin_amd64.syso create mode 100644 src/pkg/runtime/race/race_linux_amd64.syso create mode 100644 src/pkg/runtime/race0.c diff --git a/src/pkg/runtime/cgocall.c b/src/pkg/runtime/cgocall.c index d9090ba67f..b96c286f10 100644 --- a/src/pkg/runtime/cgocall.c +++ b/src/pkg/runtime/cgocall.c @@ -6,6 +6,7 @@ #include "arch_GOARCH.h" #include "stack.h" #include "cgocall.h" +#include "race.h" // Cgo call and callback support. // @@ -83,6 +84,7 @@ // callee-save registers for gcc and returns to GoF, which returns to f. void *initcgo; /* filled in by dynamic linker when Cgo is available */ +static int64 cgosync; /* represents possible synchronization in C code */ // These two are only used by the architecture where TLS based storage isn't // the default for g and m (e.g., ARM) @@ -99,12 +101,20 @@ runtime·cgocall(void (*fn)(void*), void *arg) { Defer d; + if(m->racecall) { + runtime·asmcgocall(fn, arg); + return; + } + if(!runtime·iscgo && !Windows) runtime·throw("cgocall unavailable"); if(fn == 0) runtime·throw("cgocall nil"); + if(raceenabled) + runtime·racereleasemerge(&cgosync); + m->ncgocall++; /* @@ -146,6 +156,9 @@ runtime·cgocall(void (*fn)(void*), void *arg) g->defer = d.link; unlockm(); } + + if(raceenabled) + runtime·raceacquire(&cgosync); } static void @@ -198,6 +211,11 @@ runtime·cgocallbackg(void (*fn)(void), void *arg, uintptr argsize) { Defer d; + if(m->racecall) { + reflect·call((byte*)fn, arg, argsize); + return; + } + if(g != m->curg) runtime·throw("runtime: bad g in cgocallback"); @@ -211,9 +229,15 @@ runtime·cgocallbackg(void (*fn)(void), void *arg, uintptr argsize) d.nofree = true; g->defer = &d; + if(raceenabled) + runtime·raceacquire(&cgosync); + // Invoke callback. reflect·call((byte*)fn, arg, argsize); + if(raceenabled) + runtime·racereleasemerge(&cgosync); + // Pop defer. // Do not unwind m->g0->sched.sp. // Our caller, cgocallback, will do that. diff --git a/src/pkg/runtime/chan.c b/src/pkg/runtime/chan.c index 05543a3dc9..0aa0b43c56 100644 --- a/src/pkg/runtime/chan.c +++ b/src/pkg/runtime/chan.c @@ -5,6 +5,7 @@ #include "runtime.h" #include "arch_GOARCH.h" #include "type.h" +#include "race.h" #include "malloc.h" #define MAXALIGN 7 @@ -82,6 +83,7 @@ static void dequeueg(WaitQ*); static SudoG* dequeue(WaitQ*); static void enqueue(WaitQ*, SudoG*); static void destroychan(Hchan*); +static void racesync(Hchan*, SudoG*); Hchan* runtime·makechan_c(ChanType *t, int64 hint) @@ -150,7 +152,7 @@ runtime·makechan(ChanType *t, int64 hint, Hchan *ret) * the operation; we'll see that it's now closed. */ void -runtime·chansend(ChanType *t, Hchan *c, byte *ep, bool *pres) +runtime·chansend(ChanType *t, Hchan *c, byte *ep, bool *pres, void *pc) { SudoG *sg; SudoG mysg; @@ -184,6 +186,9 @@ runtime·chansend(ChanType *t, Hchan *c, byte *ep, bool *pres) } runtime·lock(c); + // TODO(dvyukov): add similar instrumentation to select. + if(raceenabled) + runtime·racereadpc(c, pc); if(c->closed) goto closed; @@ -192,6 +197,8 @@ runtime·chansend(ChanType *t, Hchan *c, byte *ep, bool *pres) sg = dequeue(&c->recvq); if(sg != nil) { + if(raceenabled) + racesync(c, sg); runtime·unlock(c); gp = sg->g; @@ -251,6 +258,10 @@ asynch: runtime·lock(c); goto asynch; } + + if(raceenabled) + runtime·racerelease(chanbuf(c, c->sendx)); + c->elemalg->copy(c->elemsize, chanbuf(c, c->sendx), ep); if(++c->sendx == c->dataqsiz) c->sendx = 0; @@ -317,6 +328,8 @@ runtime·chanrecv(ChanType *t, Hchan* c, byte *ep, bool *selected, bool *receive sg = dequeue(&c->sendq); if(sg != nil) { + if(raceenabled) + racesync(c, sg); runtime·unlock(c); if(ep != nil) @@ -381,6 +394,10 @@ asynch: runtime·lock(c); goto asynch; } + + if(raceenabled) + runtime·raceacquire(chanbuf(c, c->recvx)); + if(ep != nil) c->elemalg->copy(c->elemsize, ep, chanbuf(c, c->recvx)); c->elemalg->copy(c->elemsize, chanbuf(c, c->recvx), nil); @@ -413,6 +430,8 @@ closed: *selected = true; if(received != nil) *received = false; + if(raceenabled) + runtime·raceacquire(c); runtime·unlock(c); if(mysg.releasetime > 0) runtime·blockevent(mysg.releasetime - t0, 2); @@ -423,7 +442,7 @@ closed: void runtime·chansend1(ChanType *t, Hchan* c, ...) { - runtime·chansend(t, c, (byte*)(&c+1), nil); + runtime·chansend(t, c, (byte*)(&c+1), nil, runtime·getcallerpc(&t)); } // chanrecv1(hchan *chan any) (elem any); @@ -473,7 +492,7 @@ runtime·selectnbsend(ChanType *t, Hchan *c, ...) ae = (byte*)(&c + 1); ap = ae + ROUND(t->elem->size, Structrnd); - runtime·chansend(t, c, ae, ap); + runtime·chansend(t, c, ae, ap, runtime·getcallerpc(&t)); } // func selectnbrecv(elem *any, c chan any) bool @@ -535,6 +554,7 @@ runtime·selectnbrecv2(ChanType *t, byte *v, bool *received, Hchan *c, bool sele // // The "uintptr selected" is really "bool selected" but saying // uintptr gets us the right alignment for the output parameter block. +#pragma textflag 7 void reflect·chansend(ChanType *t, Hchan *c, uintptr val, bool nb, uintptr selected) { @@ -553,7 +573,7 @@ reflect·chansend(ChanType *t, Hchan *c, uintptr val, bool nb, uintptr selected) vp = (byte*)&val; else vp = (byte*)val; - runtime·chansend(t, c, vp, sp); + runtime·chansend(t, c, vp, sp, runtime·getcallerpc(&t)); } // For reflect: @@ -972,6 +992,8 @@ loop: asyncrecv: // can receive from buffer + if(raceenabled) + runtime·raceacquire(chanbuf(c, c->recvx)); if(cas->receivedp != nil) *cas->receivedp = true; if(cas->sg.elem != nil) @@ -992,6 +1014,8 @@ asyncrecv: asyncsend: // can send to buffer + if(raceenabled) + runtime·racerelease(chanbuf(c, c->sendx)); c->elemalg->copy(c->elemsize, chanbuf(c, c->sendx), cas->sg.elem); if(++c->sendx == c->dataqsiz) c->sendx = 0; @@ -1008,6 +1032,8 @@ asyncsend: syncrecv: // can receive from sleeping sender (sg) + if(raceenabled) + racesync(c, sg); selunlock(sel); if(debug) runtime·printf("syncrecv: sel=%p c=%p o=%d\n", sel, c, o); @@ -1027,10 +1053,14 @@ rclose: *cas->receivedp = false; if(cas->sg.elem != nil) c->elemalg->copy(c->elemsize, cas->sg.elem, nil); + if(raceenabled) + runtime·raceacquire(c); goto retc; syncsend: // can send to sleeping receiver (sg) + if(raceenabled) + racesync(c, sg); selunlock(sel); if(debug) runtime·printf("syncsend: sel=%p c=%p o=%d\n", sel, c, o); @@ -1143,6 +1173,7 @@ reflect·rselect(Slice cases, intgo chosen, uintptr word, bool recvOK) } // closechan(sel *byte); +#pragma textflag 7 void runtime·closechan(Hchan *c) { @@ -1161,6 +1192,11 @@ runtime·closechan(Hchan *c) runtime·panicstring("close of closed channel"); } + if(raceenabled) { + runtime·racewritepc(c, runtime·getcallerpc(&c)); + runtime·racerelease(c); + } + c->closed = true; // release all readers @@ -1268,3 +1304,12 @@ enqueue(WaitQ *q, SudoG *sgp) q->last->link = sgp; q->last = sgp; } + +static void +racesync(Hchan *c, SudoG *sg) +{ + runtime·racerelease(chanbuf(c, 0)); + runtime·raceacquireg(sg->g, chanbuf(c, 0)); + runtime·racereleaseg(sg->g, chanbuf(c, 0)); + runtime·raceacquire(chanbuf(c, 0)); +} diff --git a/src/pkg/runtime/hashmap.c b/src/pkg/runtime/hashmap.c index dbb944c3fe..fec407b67a 100644 --- a/src/pkg/runtime/hashmap.c +++ b/src/pkg/runtime/hashmap.c @@ -5,6 +5,7 @@ #include "runtime.h" #include "hashmap.h" #include "type.h" +#include "race.h" /* Hmap flag values */ #define IndirectVal (1<<0) /* storing pointers to values */ @@ -831,6 +832,9 @@ runtime·mapaccess1(MapType *t, Hmap *h, ...) byte *ak, *av; bool pres; + if(raceenabled && h != nil) + runtime·racereadpc(h, runtime·getcallerpc(&t)); + ak = (byte*)(&h + 1); av = ak + ROUND(t->key->size, Structrnd); @@ -856,6 +860,9 @@ runtime·mapaccess2(MapType *t, Hmap *h, ...) { byte *ak, *av, *ap; + if(raceenabled && h != nil) + runtime·racereadpc(h, runtime·getcallerpc(&t)); + ak = (byte*)(&h + 1); av = ak + ROUND(t->key->size, Structrnd); ap = av + t->elem->size; @@ -884,6 +891,9 @@ reflect·mapaccess(MapType *t, Hmap *h, uintptr key, uintptr val, bool pres) { byte *ak, *av; + if(raceenabled && h != nil) + runtime·racereadpc(h, runtime·getcallerpc(&t)); + if(t->key->size <= sizeof(key)) ak = (byte*)&key; else @@ -954,6 +964,8 @@ runtime·mapassign1(MapType *t, Hmap *h, ...) if(h == nil) runtime·panicstring("assignment to entry in nil map"); + if(raceenabled) + runtime·racewritepc(h, runtime·getcallerpc(&t)); ak = (byte*)(&h + 1); av = ak + ROUND(t->key->size, t->elem->align); @@ -970,6 +982,8 @@ runtime·mapdelete(MapType *t, Hmap *h, ...) if(h == nil) runtime·panicstring("deletion of entry in nil map"); + if(raceenabled) + runtime·racewritepc(h, runtime·getcallerpc(&t)); ak = (byte*)(&h + 1); runtime·mapassign(t, h, ak, nil); @@ -993,6 +1007,8 @@ reflect·mapassign(MapType *t, Hmap *h, uintptr key, uintptr val, bool pres) if(h == nil) runtime·panicstring("assignment to entry in nil map"); + if(raceenabled) + runtime·racewritepc(h, runtime·getcallerpc(&t)); if(t->key->size <= sizeof(key)) ak = (byte*)&key; else @@ -1014,6 +1030,8 @@ runtime·mapiterinit(MapType *t, Hmap *h, struct hash_iter *it) it->data = nil; return; } + if(raceenabled) + runtime·racereadpc(h, runtime·getcallerpc(&t)); hash_iter_init(t, h, it); it->data = hash_next(it); if(debug) { @@ -1057,6 +1075,8 @@ reflect·mapiterinit(MapType *t, Hmap *h, struct hash_iter *it) void runtime·mapiternext(struct hash_iter *it) { + if(raceenabled) + runtime·racereadpc(it->h, runtime·getcallerpc(&it)); if(runtime·gcwaiting) runtime·gosched(); @@ -1158,8 +1178,11 @@ reflect·maplen(Hmap *h, intgo len) { if(h == nil) len = 0; - else + else { len = h->count; + if(raceenabled) + runtime·racereadpc(h, runtime·getcallerpc(&h)); + } FLUSH(&len); } diff --git a/src/pkg/runtime/malloc.goc b/src/pkg/runtime/malloc.goc index 7253db8f42..92bc4aa234 100644 --- a/src/pkg/runtime/malloc.goc +++ b/src/pkg/runtime/malloc.goc @@ -14,6 +14,7 @@ package runtime #include "defs_GOOS_GOARCH.h" #include "type.h" #include "typekind.h" +#include "race.h" #pragma dataflag 16 /* mark mheap as 'no pointers', hiding from garbage collector */ MHeap runtime·mheap; @@ -111,6 +112,11 @@ runtime·mallocgc(uintptr size, uint32 flag, int32 dogc, int32 zeroed) if(dogc && mstats.heap_alloc >= mstats.next_gc) runtime·gc(0); + + if(raceenabled) { + runtime·racemalloc(v, size, m->racepc); + m->racepc = nil; + } return v; } @@ -146,6 +152,9 @@ runtime·free(void *v) } prof = runtime·blockspecial(v); + if(raceenabled) + runtime·racefree(v); + // Find size class for v. sizeclass = s->sizeclass; c = m->mcache; @@ -678,8 +687,14 @@ runtime·mal(uintptr n) return runtime·mallocgc(n, 0, 1, 1); } -func new(typ *Type) (ret *uint8) { - uint32 flag = typ->kind&KindNoPointers ? FlagNoPointers : 0; +#pragma textflag 7 +void +runtime·new(Type *typ, uint8 *ret) +{ + uint32 flag; + + m->racepc = runtime·getcallerpc(&typ); + flag = typ->kind&KindNoPointers ? FlagNoPointers : 0; ret = runtime·mallocgc(typ->size, flag, 1, 1); if(UseSpanType && !flag) { diff --git a/src/pkg/runtime/mgc0.c b/src/pkg/runtime/mgc0.c index 4ee0bfda49..6c2ce00953 100644 --- a/src/pkg/runtime/mgc0.c +++ b/src/pkg/runtime/mgc0.c @@ -8,6 +8,7 @@ #include "arch_GOARCH.h" #include "malloc.h" #include "stack.h" +#include "race.h" enum { Debug = 0, @@ -1055,6 +1056,9 @@ runfinq(void) byte *frame; uint32 framesz, framecap, i; + if(raceenabled) + runtime·racefingo(); + frame = nil; framecap = 0; for(;;) { diff --git a/src/pkg/runtime/proc.c b/src/pkg/runtime/proc.c index 36a362e7e2..1cb8bf5864 100644 --- a/src/pkg/runtime/proc.c +++ b/src/pkg/runtime/proc.c @@ -8,6 +8,7 @@ #include "malloc.h" #include "os_GOOS.h" #include "stack.h" +#include "race.h" bool runtime·iscgo; @@ -210,6 +211,9 @@ runtime·schedinit(void) mstats.enablegc = 1; m->nomemprof--; + + if(raceenabled) + runtime·raceinit(); } extern void main·init(void); @@ -241,6 +245,8 @@ runtime·main(void) runtime·gosched(); main·main(); + if(raceenabled) + runtime·racefini(); runtime·exit(0); for(;;) *(int32*)runtime·main = 0; @@ -885,6 +891,8 @@ schedule(G *gp) gput(gp); break; case Gmoribund: + if(raceenabled) + runtime·racegoend(gp->goid); gp->status = Gdead; if(gp->lockedm) { gp->lockedm = nil; @@ -1278,6 +1286,7 @@ runtime·newproc1(byte *fn, byte *argp, int32 narg, int32 nret, void *callerpc) byte *sp; G *newg; int32 siz; + int32 goid; //printf("newproc1 %p %p narg=%d nret=%d\n", fn, argp, narg, nret); siz = narg + nret; @@ -1290,6 +1299,10 @@ runtime·newproc1(byte *fn, byte *argp, int32 narg, int32 nret, void *callerpc) if(siz > StackMin - 1024) runtime·throw("runtime.newproc: function arguments too large for new goroutine"); + goid = runtime·xadd((uint32*)&runtime·sched.goidgen, 1); + if(raceenabled) + runtime·racegostart(goid, callerpc); + schedlock(); if((newg = gfget()) != nil) { @@ -1322,8 +1335,7 @@ runtime·newproc1(byte *fn, byte *argp, int32 narg, int32 nret, void *callerpc) newg->gopc = (uintptr)callerpc; runtime·sched.gcount++; - runtime·sched.goidgen++; - newg->goid = runtime·sched.goidgen; + newg->goid = goid; newprocreadylocked(newg); schedunlock(); diff --git a/src/pkg/runtime/race.c b/src/pkg/runtime/race.c new file mode 100644 index 0000000000..a94298f055 --- /dev/null +++ b/src/pkg/runtime/race.c @@ -0,0 +1,255 @@ +// Copyright 2011 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Implementation of the race detector API. +// +build race + +#include "runtime.h" +#include "arch_GOARCH.h" +#include "malloc.h" +#include "race.h" + +void runtime∕race·Initialize(void); +void runtime∕race·Finalize(void); +void runtime∕race·FinalizerGoroutine(int32); +void runtime∕race·Read(int32 goid, void *addr, void *pc); +void runtime∕race·Write(int32 goid, void *addr, void *pc); +void runtime∕race·FuncEnter(int32 goid, void *pc); +void runtime∕race·FuncExit(int32 goid); +void runtime∕race·Malloc(int32 goid, void *p, uintptr sz, void *pc); +void runtime∕race·Free(void *p); +void runtime∕race·GoStart(int32 pgoid, int32 chgoid, void *pc); +void runtime∕race·GoEnd(int32 goid); +void runtime∕race·Acquire(int32 goid, void *addr); +void runtime∕race·Release(int32 goid, void *addr); +void runtime∕race·ReleaseMerge(int32 goid, void *addr); + +extern byte noptrdata[]; +extern byte enoptrbss[]; + +static bool onstack(uintptr argp); + +void +runtime·raceinit(void) +{ + m->racecall = true; + runtime∕race·Initialize(); + m->racecall = false; +} + +void +runtime·racefini(void) +{ + m->racecall = true; + runtime∕race·Finalize(); + m->racecall = false; +} + +// Called from instrumented code. +void +runtime·racewrite(uintptr addr) +{ + if(!onstack(addr)) { + m->racecall = true; + runtime∕race·Write(g->goid-1, (void*)addr, runtime·getcallerpc(&addr)); + m->racecall = false; + } +} + +// Called from instrumented code. +void +runtime·raceread(uintptr addr) +{ + if(!onstack(addr)) { + m->racecall = true; + runtime∕race·Read(g->goid-1, (void*)addr, runtime·getcallerpc(&addr)); + m->racecall = false; + } +} + +// Called from instrumented code. +void +runtime·racefuncenter(void) +{ + uintptr pc; + + runtime·callers(2, &pc, 1); + m->racecall = true; + runtime∕race·FuncEnter(g->goid-1, (void*)pc); + m->racecall = false; +} + +// Called from instrumented code. +void +runtime·racefuncexit(void) +{ + m->racecall = true; + runtime∕race·FuncExit(g->goid-1); + m->racecall = false; +} + +void +runtime·racemalloc(void *p, uintptr sz, void *pc) +{ + m->racecall = true; + runtime∕race·Malloc(g->goid-1, p, sz, pc); + m->racecall = false; +} + +void +runtime·racefree(void *p) +{ + m->racecall = true; + runtime∕race·Free(p); + m->racecall = false; +} + +void +runtime·racegostart(int32 goid, void *pc) +{ + m->racecall = true; + runtime∕race·GoStart(g->goid-1, goid-1, pc); + m->racecall = false; +} + +void +runtime·racegoend(int32 goid) +{ + m->racecall = true; + runtime∕race·GoEnd(goid-1); + m->racecall = false; +} + +void +runtime·racewritepc(void *addr, void *pc) +{ + if(!onstack((uintptr)addr)) { + m->racecall = true; + runtime∕race·Write(g->goid-1, addr, pc); + m->racecall = false; + } +} + +void +runtime·racereadpc(void *addr, void *pc) +{ + if(!onstack((uintptr)addr)) { + m->racecall = true; + runtime∕race·Read(g->goid-1, addr, pc); + m->racecall = false; + } +} + +void +runtime·raceacquire(void *addr) +{ + runtime·raceacquireg(g, addr); +} + +void +runtime·raceacquireg(G *gp, void *addr) +{ + if(g->raceignore) + return; + m->racecall = true; + runtime∕race·Acquire(gp->goid-1, addr); + m->racecall = false; +} + +void +runtime·racerelease(void *addr) +{ + runtime·racereleaseg(g, addr); +} + +void +runtime·racereleaseg(G *gp, void *addr) +{ + if(g->raceignore) + return; + m->racecall = true; + runtime∕race·Release(gp->goid-1, addr); + m->racecall = false; +} + +void +runtime·racereleasemerge(void *addr) +{ + runtime·racereleasemergeg(g, addr); +} + +void +runtime·racereleasemergeg(G *gp, void *addr) +{ + if(g->raceignore) + return; + m->racecall = true; + runtime∕race·ReleaseMerge(gp->goid-1, addr); + m->racecall = false; +} + +void +runtime·racefingo(void) +{ + m->racecall = true; + runtime∕race·FinalizerGoroutine(g->goid - 1); + m->racecall = false; +} + +// func RaceAcquire(addr unsafe.Pointer) +void +runtime·RaceAcquire(void *addr) +{ + runtime·raceacquire(addr); +} + +// func RaceRelease(addr unsafe.Pointer) +void +runtime·RaceRelease(void *addr) +{ + runtime·racerelease(addr); +} + +// func RaceReleaseMerge(addr unsafe.Pointer) +void +runtime·RaceReleaseMerge(void *addr) +{ + runtime·racereleasemerge(addr); +} + +// func RaceSemacquire(s *uint32) +void runtime·RaceSemacquire(uint32 *s) +{ + runtime·semacquire(s); +} + +// func RaceSemrelease(s *uint32) +void runtime·RaceSemrelease(uint32 *s) +{ + runtime·semrelease(s); +} + +// func RaceDisable() +void runtime·RaceDisable(void) +{ + g->raceignore++; +} + +// func RaceEnable() +void runtime·RaceEnable(void) +{ + g->raceignore--; +} + +static bool +onstack(uintptr argp) +{ + // noptrdata, data, bss, noptrbss + // the layout is in ../../cmd/ld/data.c + if((byte*)argp >= noptrdata && (byte*)argp < enoptrbss) + return false; + if((byte*)argp >= runtime·mheap.arena_start && (byte*)argp < runtime·mheap.arena_used) + return false; + return true; +} diff --git a/src/pkg/runtime/race.go b/src/pkg/runtime/race.go new file mode 100644 index 0000000000..5f995762c8 --- /dev/null +++ b/src/pkg/runtime/race.go @@ -0,0 +1,26 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build race + +// Public race detection API, present iff build with -race. + +package runtime + +import ( + "unsafe" +) + +// RaceDisable disables handling of race events in the current goroutine. +func RaceDisable() + +// RaceEnable re-enables handling of race events in the current goroutine. +func RaceEnable() + +func RaceAcquire(addr unsafe.Pointer) +func RaceRelease(addr unsafe.Pointer) +func RaceReleaseMerge(addr unsafe.Pointer) + +func RaceSemacquire(s *uint32) +func RaceSemrelease(s *uint32) diff --git a/src/pkg/runtime/race.h b/src/pkg/runtime/race.h new file mode 100644 index 0000000000..eea1f9465e --- /dev/null +++ b/src/pkg/runtime/race.h @@ -0,0 +1,30 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Definitions related to data race detection. + +#ifdef RACE +enum { raceenabled = 1 }; +#else +enum { raceenabled = 0 }; +#endif + +// Initialize race detection subsystem. +void runtime·raceinit(void); +// Finalize race detection subsystem, does not return. +void runtime·racefini(void); + +void runtime·racemalloc(void *p, uintptr sz, void *pc); +void runtime·racefree(void *p); +void runtime·racegostart(int32 goid, void *pc); +void runtime·racegoend(int32 goid); +void runtime·racewritepc(void *addr, void *pc); +void runtime·racereadpc(void *addr, void *pc); +void runtime·racefingo(void); +void runtime·raceacquire(void *addr); +void runtime·raceacquireg(G *gp, void *addr); +void runtime·racerelease(void *addr); +void runtime·racereleaseg(G *gp, void *addr); +void runtime·racereleasemerge(void *addr); +void runtime·racereleasemergeg(G *gp, void *addr); diff --git a/src/pkg/runtime/race/race.go b/src/pkg/runtime/race/race.go new file mode 100644 index 0000000000..ddeff5de76 --- /dev/null +++ b/src/pkg/runtime/race/race.go @@ -0,0 +1,105 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build race,linux,amd64 race,darwin,amd64 + +// Data race detection. +package race + +/* +void __tsan_init(void); +void __tsan_fini(void); +void __tsan_go_start(int pgoid, int chgoid, void *pc); +void __tsan_go_end(int goid); +void __tsan_read(int goid, void *addr, void *pc); +void __tsan_write(int goid, void *addr, void *pc); +void __tsan_func_enter(int goid, void *pc); +void __tsan_func_exit(int goid); +void __tsan_malloc(int goid, void *p, long sz, void *pc); +void __tsan_free(void *p); +void __tsan_acquire(int goid, void *addr); +void __tsan_release(int goid, void *addr); +void __tsan_release_merge(int goid, void *addr); +void __tsan_finalizer_goroutine(int tid); +*/ +import "C" + +import ( + "runtime" + "unsafe" +) + +func Initialize() { + C.__tsan_init() +} + +func Finalize() { + C.__tsan_fini() +} + +func FinalizerGoroutine(goid int32) { + C.__tsan_finalizer_goroutine(C.int(goid)) +} + +func Read(goid int32, addr, pc uintptr) { + C.__tsan_read(C.int(goid), unsafe.Pointer(addr), unsafe.Pointer(pc)) +} + +func Write(goid int32, addr, pc uintptr) { + C.__tsan_write(C.int(goid), unsafe.Pointer(addr), unsafe.Pointer(pc)) +} + +func FuncEnter(goid int32, pc uintptr) { + C.__tsan_func_enter(C.int(goid), unsafe.Pointer(pc)) +} + +func FuncExit(goid int32) { + C.__tsan_func_exit(C.int(goid)) +} + +func Malloc(goid int32, p, sz, pc uintptr) { + C.__tsan_malloc(C.int(goid), unsafe.Pointer(p), C.long(sz), unsafe.Pointer(pc)) +} + +func Free(p uintptr) { + C.__tsan_free(unsafe.Pointer(p)) +} + +func GoStart(pgoid, chgoid int32, pc uintptr) { + C.__tsan_go_start(C.int(pgoid), C.int(chgoid), unsafe.Pointer(pc)) +} + +func GoEnd(goid int32) { + C.__tsan_go_end(C.int(goid)) +} + +func Acquire(goid int32, addr uintptr) { + C.__tsan_acquire(C.int(goid), unsafe.Pointer(addr)) +} + +func Release(goid int32, addr uintptr) { + C.__tsan_release(C.int(goid), unsafe.Pointer(addr)) +} + +func ReleaseMerge(goid int32, addr uintptr) { + C.__tsan_release_merge(C.int(goid), unsafe.Pointer(addr)) +} + +//export __tsan_symbolize +func __tsan_symbolize(pc uintptr, fun, file **C.char, line, off *C.int) C.int { + f := runtime.FuncForPC(pc) + if f == nil { + *fun = C.CString("??") + *file = C.CString("-") + *line = 0 + *off = C.int(pc) + return 1 + } + fi, l := f.FileLine(pc) + *fun = C.CString(f.Name()) + *file = C.CString(fi) + *line = C.int(l) + *off = C.int(pc - f.Entry()) + return 1 +} diff --git a/src/pkg/runtime/race/race_darwin_amd64.syso b/src/pkg/runtime/race/race_darwin_amd64.syso new file mode 100644 index 0000000000000000000000000000000000000000..b291e8e07853a92b86c7f07e61a09d33b76214e5 GIT binary patch literal 144548 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 z%0A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 literal 0 HcmV?d00001 diff --git a/src/pkg/runtime/race0.c b/src/pkg/runtime/race0.c new file mode 100644 index 0000000000..b650a14712 --- /dev/null +++ b/src/pkg/runtime/race0.c @@ -0,0 +1,103 @@ +// Copyright 2011 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Stub implementation of the race detector API. +// +build !race + +#include "runtime.h" + +void +runtime·raceinit(void) +{ +} + +void +runtime·racefini(void) +{ +} + +void +runtime·racewritepc(void *addr, void *pc) +{ + USED(addr); + USED(pc); +} + +void +runtime·racereadpc(void *addr, void *pc) +{ + USED(addr); + USED(pc); +} + +void +runtime·raceacquire(void *addr) +{ + USED(addr); +} + +void +runtime·raceacquireg(G *gp, void *addr) +{ + USED(gp); + USED(addr); +} + +void +runtime·racerelease(void *addr) +{ + USED(addr); +} + +void +runtime·racereleaseg(G *gp, void *addr) +{ + USED(gp); + USED(addr); +} + +void +runtime·racereleasemerge(void *addr) +{ + USED(addr); +} + +void +runtime·racereleasemergeg(G *gp, void *addr) +{ + USED(gp); + USED(addr); +} + +void +runtime·racefingo(void) +{ +} + +void +runtime·racemalloc(void *p, uintptr sz, void *pc) +{ + USED(p); + USED(sz); + USED(pc); +} + +void +runtime·racefree(void *p) +{ + USED(p); +} + +void +runtime·racegostart(int32 goid, void *pc) +{ + USED(goid); + USED(pc); +} + +void +runtime·racegoend(int32 goid) +{ + USED(goid); +} diff --git a/src/pkg/runtime/runtime.h b/src/pkg/runtime/runtime.h index f808b590ed..0b0931fe93 100644 --- a/src/pkg/runtime/runtime.h +++ b/src/pkg/runtime/runtime.h @@ -210,6 +210,7 @@ struct G G* schedlink; bool readyonstop; bool ispanic; + int8 raceignore; // ignore race detection events M* m; // for debuggers, but offset not hard-coded M* lockedm; M* idlem; @@ -267,6 +268,8 @@ struct M uint32 waitsemacount; uint32 waitsemalock; GCStats gcstats; + bool racecall; + void* racepc; uintptr settype_buf[1024]; uintptr settype_bufsize; @@ -816,7 +819,7 @@ void runtime·mapiterkeyvalue(struct hash_iter*, void*, void*); Hmap* runtime·makemap_c(MapType*, int64); Hchan* runtime·makechan_c(ChanType*, int64); -void runtime·chansend(ChanType*, Hchan*, byte*, bool*); +void runtime·chansend(ChanType*, Hchan*, byte*, bool*, void*); void runtime·chanrecv(ChanType*, Hchan*, byte*, bool*, bool*); bool runtime·showframe(Func*); diff --git a/src/pkg/runtime/slice.c b/src/pkg/runtime/slice.c index b977f45824..d24f6a88ae 100644 --- a/src/pkg/runtime/slice.c +++ b/src/pkg/runtime/slice.c @@ -7,6 +7,7 @@ #include "type.h" #include "typekind.h" #include "malloc.h" +#include "race.h" static bool debug = 0; @@ -58,17 +59,27 @@ makeslice1(SliceType *t, intgo len, intgo cap, Slice *ret) } // appendslice(type *Type, x, y, []T) []T +#pragma textflag 7 void runtime·appendslice(SliceType *t, Slice x, Slice y, Slice ret) { - intgo m; + intgo m, i; uintptr w; + void *pc; m = x.len+y.len; if(m < x.len) runtime·throw("append: slice overflow"); + if(raceenabled) { + pc = runtime·getcallerpc(&t); + for(i=0; ielem->size, pc); + for(i=x.len; ielem->size, pc); + } + if(m > x.cap) growslice1(t, x, m, &ret); else @@ -82,16 +93,26 @@ runtime·appendslice(SliceType *t, Slice x, Slice y, Slice ret) // appendstr([]byte, string) []byte +#pragma textflag 7 void runtime·appendstr(SliceType *t, Slice x, String y, Slice ret) { - intgo m; + intgo m, i; + void *pc; m = x.len+y.len; if(m < x.len) runtime·throw("append: slice overflow"); + if(raceenabled) { + pc = runtime·getcallerpc(&t); + for(i=0; ielem->size, pc); + for(i=x.len; ielem->size, pc); + } + if(m > x.cap) growslice1(t, x, m, &ret); else @@ -108,6 +129,8 @@ void runtime·growslice(SliceType *t, Slice old, int64 n, Slice ret) { int64 cap; + void *pc; + int32 i; if(n < 1) runtime·panicstring("growslice: invalid n"); @@ -117,6 +140,12 @@ runtime·growslice(SliceType *t, Slice old, int64 n, Slice ret) if((intgo)cap != cap || cap < old.cap || (t->elem->size > 0 && cap > MaxMem/t->elem->size)) runtime·panicstring("growslice: cap out of range"); + if(raceenabled) { + pc = runtime·getcallerpc(&t); + for(i=0; ielem->size, pc); + } + growslice1(t, old, cap, &ret); FLUSH(&ret); @@ -155,9 +184,13 @@ growslice1(SliceType *t, Slice x, intgo newcap, Slice *ret) } // copy(to any, fr any, wid uintptr) int +#pragma textflag 7 void runtime·copy(Slice to, Slice fm, uintptr width, intgo ret) { + void *pc; + int32 i; + if(fm.len == 0 || to.len == 0 || width == 0) { ret = 0; goto out; @@ -167,6 +200,14 @@ runtime·copy(Slice to, Slice fm, uintptr width, intgo ret) if(to.len < ret) ret = to.len; + if(raceenabled) { + pc = runtime·getcallerpc(&to); + for(i=0; if; arg = t->arg; runtime·unlock(&timers); + if(raceenabled) + runtime·raceacquire(t); f(now, arg); runtime·lock(&timers); } -- 2.48.1