mirror of https://github.com/golang/go.git
runtime/cgo: add tsan acquire/release around setenv/unsetenv
Change-Id: Iabb25e97714d070c31c657559a97a3bfc979da18 Reviewed-on: https://go-review.googlesource.com/25403 Reviewed-by: Dmitry Vyukov <dvyukov@google.com> Run-TryBot: Ian Lance Taylor <iant@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org>
This commit is contained in:
parent
0889d2d04a
commit
2d85e87f08
|
|
@ -161,6 +161,9 @@ if test "$tsan" = "yes"; then
|
||||||
|
|
||||||
# This test requires rebuilding runtime/cgo with -fsanitize=thread.
|
# This test requires rebuilding runtime/cgo with -fsanitize=thread.
|
||||||
testtsan tsan6.go "CGO_CFLAGS=-fsanitize=thread CGO_LDFLAGS=-fsanitize=thread" "-installsuffix=tsan"
|
testtsan tsan6.go "CGO_CFLAGS=-fsanitize=thread CGO_LDFLAGS=-fsanitize=thread" "-installsuffix=tsan"
|
||||||
|
|
||||||
|
# This test requires rebuilding runtime/cgo with -fsanitize=thread.
|
||||||
|
testtsan tsan7.go "CGO_CFLAGS=-fsanitize=thread CGO_LDFLAGS=-fsanitize=thread" "-installsuffix=tsan"
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,40 @@
|
||||||
|
// Copyright 2016 The Go Authors. All rights reserved.
|
||||||
|
// Use of this source code is governed by a BSD-style
|
||||||
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
package main
|
||||||
|
|
||||||
|
// Setting an environment variable in a cgo program changes the C
|
||||||
|
// environment. Test that this does not confuse the race detector.
|
||||||
|
|
||||||
|
/*
|
||||||
|
#cgo CFLAGS: -fsanitize=thread
|
||||||
|
#cgo LDFLAGS: -fsanitize=thread
|
||||||
|
*/
|
||||||
|
import "C"
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"os"
|
||||||
|
"sync"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
var wg sync.WaitGroup
|
||||||
|
var mu sync.Mutex
|
||||||
|
f := func() {
|
||||||
|
defer wg.Done()
|
||||||
|
for i := 0; i < 100; i++ {
|
||||||
|
time.Sleep(time.Microsecond)
|
||||||
|
mu.Lock()
|
||||||
|
s := fmt.Sprint(i)
|
||||||
|
os.Setenv("TSAN_TEST"+s, s)
|
||||||
|
mu.Unlock()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
wg.Add(2)
|
||||||
|
go f()
|
||||||
|
go f()
|
||||||
|
wg.Wait()
|
||||||
|
}
|
||||||
|
|
@ -13,12 +13,16 @@
|
||||||
void
|
void
|
||||||
x_cgo_setenv(char **arg)
|
x_cgo_setenv(char **arg)
|
||||||
{
|
{
|
||||||
|
_cgo_tsan_acquire();
|
||||||
setenv(arg[0], arg[1], 1);
|
setenv(arg[0], arg[1], 1);
|
||||||
|
_cgo_tsan_release();
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Stub for calling unsetenv */
|
/* Stub for calling unsetenv */
|
||||||
void
|
void
|
||||||
x_cgo_unsetenv(char *arg)
|
x_cgo_unsetenv(char *arg)
|
||||||
{
|
{
|
||||||
|
_cgo_tsan_acquire();
|
||||||
unsetenv(arg);
|
unsetenv(arg);
|
||||||
|
_cgo_tsan_release();
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue