From: Keith Randall Date: Tue, 3 Dec 2013 02:03:25 +0000 (-0800) Subject: runtime: fix race detector when map keys/values are passed by pointer. X-Git-Tag: go1.3beta1~1320 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=c0f229457731daa170fea3c8eb2c4f4c363266d3;p=gostls13.git 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 --- diff --git a/src/pkg/runtime/hashmap.c b/src/pkg/runtime/hashmap.c index d67637b6d4..5be1597615 100644 --- a/src/pkg/runtime/hashmap.c +++ b/src/pkg/runtime/hashmap.c @@ -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);