From c0f229457731daa170fea3c8eb2c4f4c363266d3 Mon Sep 17 00:00:00 2001 From: Keith Randall Date: Mon, 2 Dec 2013 18:03:25 -0800 Subject: [PATCH] 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 --- src/pkg/runtime/hashmap.c | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/src/pkg/runtime/hashmap.c b/src/pkg/runtime/hashmap.c index d67637b6d44..5be15976156 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);