1
0
mirror of https://github.com/golang/go synced 2024-10-04 06:31:22 -06:00

runtime: fix race detector when map keys/values are passed by pointer.

Now that the map implementation is reading the keys and values from
arbitrary memory (instead of from stack slots), it needs to tell the
race detector when it does so.

Fixes #6875.

R=golang-dev, dave
CC=golang-dev
https://golang.org/cl/36360043
This commit is contained in:
Keith Randall 2013-12-02 18:03:25 -08:00
parent 742f755a29
commit c0f2294577

View File

@ -991,9 +991,10 @@ reflect·makemap(MapType *t, Hmap *ret)
void
runtime·mapaccess1(MapType *t, Hmap *h, byte *ak, byte *av)
{
if(raceenabled && h != nil)
if(raceenabled && h != nil) {
runtime·racereadpc(h, runtime·getcallerpc(&t), runtime·mapaccess1);
runtime·racereadpc(ak, runtime·getcallerpc(&t), runtime·mapaccess1);
}
if(h == nil || h->count == 0) {
av = t->elem->zero;
} else {
@ -1021,8 +1022,10 @@ runtime·mapaccess1(MapType *t, Hmap *h, byte *ak, byte *av)
void
runtime·mapaccess2(MapType *t, Hmap *h, byte *ak, byte *av, bool pres)
{
if(raceenabled && h != nil)
if(raceenabled && h != nil) {
runtime·racereadpc(h, runtime·getcallerpc(&t), runtime·mapaccess2);
runtime·racereadpc(ak, runtime·getcallerpc(&t), runtime·mapaccess2);
}
if(h == nil || h->count == 0) {
av = t->elem->zero;
@ -1097,8 +1100,11 @@ runtime·mapassign1(MapType *t, Hmap *h, byte *ak, byte *av)
if(h == nil)
runtime·panicstring("assignment to entry in nil map");
if(raceenabled)
if(raceenabled) {
runtime·racewritepc(h, runtime·getcallerpc(&t), runtime·mapassign1);
runtime·racereadpc(ak, runtime·getcallerpc(&t), runtime·mapassign1);
runtime·racereadpc(av, runtime·getcallerpc(&t), runtime·mapassign1);
}
hash_insert(t, h, ak, av);
@ -1121,8 +1127,10 @@ runtime·mapdelete(MapType *t, Hmap *h, byte *ak)
if(h == nil)
return;
if(raceenabled)
if(raceenabled) {
runtime·racewritepc(h, runtime·getcallerpc(&t), runtime·mapdelete);
runtime·racereadpc(ak, runtime·getcallerpc(&t), runtime·mapdelete);
}
hash_remove(t, h, ak);