mirror of
https://github.com/golang/go
synced 2024-11-23 05:40:04 -07:00
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.
|
||||
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
|
||||
|
||||
|
40
misc/cgo/testsanitizers/tsan7.go
Normal file
40
misc/cgo/testsanitizers/tsan7.go
Normal file
@ -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
|
||||
x_cgo_setenv(char **arg)
|
||||
{
|
||||
_cgo_tsan_acquire();
|
||||
setenv(arg[0], arg[1], 1);
|
||||
_cgo_tsan_release();
|
||||
}
|
||||
|
||||
/* Stub for calling unsetenv */
|
||||
void
|
||||
x_cgo_unsetenv(char *arg)
|
||||
{
|
||||
_cgo_tsan_acquire();
|
||||
unsetenv(arg);
|
||||
_cgo_tsan_release();
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user