aboutsummaryrefslogtreecommitdiff
path: root/src/pkg/runtime/hashmap.c
diff options
context:
space:
mode:
authorKeith Randall <khr@golang.org>2013-12-02 18:03:25 -0800
committerKeith Randall <khr@golang.org>2013-12-02 18:03:25 -0800
commitc0f229457731daa170fea3c8eb2c4f4c363266d3 (patch)
tree78e3de47ce7f59fdc6e2a1d2ff24e878e9c0915b /src/pkg/runtime/hashmap.c
parent742f755a29493b111d54a0d39d80083994dcaf1a (diff)
downloadgo-c0f229457731daa170fea3c8eb2c4f4c363266d3.tar.xz
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
Diffstat (limited to 'src/pkg/runtime/hashmap.c')
-rw-r--r--src/pkg/runtime/hashmap.c18
1 files changed, 13 insertions, 5 deletions
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);