Commit 4a524311 authored by Dmitriy Vyukov's avatar Dmitriy Vyukov

runtime: instrument slicebytetostring for race detection

R=golang-dev, iant
CC=golang-dev
https://golang.org/cl/7322068
parent 96082a69
......@@ -443,3 +443,23 @@ func TestRaceSliceIndexAccess2(t *testing.T) {
_ = s[v]
<-c
}
func TestRaceSliceByteToString(t *testing.T) {
c := make(chan string)
s := make([]byte, 10)
go func() {
c <- string(s)
}()
s[0] = 42
<-c
}
func TestRaceSliceRuneToString(t *testing.T) {
c := make(chan string)
s := make([]rune, 10)
go func() {
c <- string(s)
}()
s[9] = 42
<-c
}
......@@ -6,6 +6,7 @@ package runtime
#include "runtime.h"
#include "arch_GOARCH.h"
#include "malloc.h"
#include "race.h"
String runtime·emptystring;
......@@ -271,6 +272,12 @@ func intstring(v int64) (s String) {
}
func slicebytetostring(b Slice) (s String) {
void *pc;
if(raceenabled) {
pc = runtime·getcallerpc(&b);
runtime·racereadrangepc(b.array, b.len, 1, pc, runtime·slicebytetostring);
}
s = gostringsize(b.len);
runtime·memmove(s.str, b.array, s.len);
}
......@@ -286,7 +293,12 @@ func slicerunetostring(b Slice) (s String) {
intgo siz1, siz2, i;
int32 *a;
byte dum[8];
void *pc;
if(raceenabled) {
pc = runtime·getcallerpc(&b);
runtime·racereadrangepc(b.array, b.len*sizeof(*a), sizeof(*a), pc, runtime·slicerunetostring);
}
a = (int32*)b.array;
siz1 = 0;
for(i=0; i<b.len; i++) {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment