]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: fix race detector when map keys/values are passed by pointer.
authorKeith Randall <khr@golang.org>
Tue, 3 Dec 2013 02:03:25 +0000 (18:03 -0800)
committerKeith Randall <khr@golang.org>
Tue, 3 Dec 2013 02:03:25 +0000 (18:03 -0800)
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

src/pkg/runtime/hashmap.c

index d67637b6d44a61746ee0ee60f9c3530479d596a1..5be159761561dd8716ec64f565b8efdf71d3f413 100644 (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);