mirror of
https://github.com/golang/go
synced 2024-11-12 09:30:25 -07:00
runtime: instrument slicebytetostring for race detection
R=golang-dev, iant CC=golang-dev https://golang.org/cl/7322068
This commit is contained in:
parent
96082a6953
commit
4a524311f4
20
src/pkg/runtime/race/testdata/slice_test.go
vendored
20
src/pkg/runtime/race/testdata/slice_test.go
vendored
@ -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++) {
|
||||
|
Loading…
Reference in New Issue
Block a user