Merge pull request #15501 from hashicorp/jbardin/race

Make sure shadow.closeWalker doesn't copy Mutexes
This commit is contained in:
James Bardin 2017-07-07 12:39:46 -04:00 committed by GitHub
commit 8e2ee53ed3
1 changed files with 12 additions and 9 deletions

View File

@ -39,6 +39,8 @@ func (w *closeWalker) Struct(reflect.Value) error {
return nil
}
var closerType = reflect.TypeOf((*io.Closer)(nil)).Elem()
func (w *closeWalker) StructField(f reflect.StructField, v reflect.Value) error {
// Not sure why this would be but lets avoid some panics
if !v.IsValid() {
@ -56,17 +58,18 @@ func (w *closeWalker) StructField(f reflect.StructField, v reflect.Value) error
return nil
}
// We're looking for an io.Closer
raw := v.Interface()
if raw == nil {
return nil
var closer io.Closer
if v.Type().Implements(closerType) {
closer = v.Interface().(io.Closer)
} else if v.CanAddr() {
// The Close method may require a pointer receiver, but we only have a value.
v := v.Addr()
if v.Type().Implements(closerType) {
closer = v.Interface().(io.Closer)
}
}
closer, ok := raw.(io.Closer)
if !ok && v.CanAddr() {
closer, ok = v.Addr().Interface().(io.Closer)
}
if !ok {
if closer == nil {
return reflectwalk.SkipEntry
}