Merge pull request #15501 from hashicorp/jbardin/race
Make sure shadow.closeWalker doesn't copy Mutexes
This commit is contained in:
commit
8e2ee53ed3
|
@ -39,6 +39,8 @@ func (w *closeWalker) Struct(reflect.Value) error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var closerType = reflect.TypeOf((*io.Closer)(nil)).Elem()
|
||||||
|
|
||||||
func (w *closeWalker) StructField(f reflect.StructField, v reflect.Value) error {
|
func (w *closeWalker) StructField(f reflect.StructField, v reflect.Value) error {
|
||||||
// Not sure why this would be but lets avoid some panics
|
// Not sure why this would be but lets avoid some panics
|
||||||
if !v.IsValid() {
|
if !v.IsValid() {
|
||||||
|
@ -56,17 +58,18 @@ func (w *closeWalker) StructField(f reflect.StructField, v reflect.Value) error
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// We're looking for an io.Closer
|
var closer io.Closer
|
||||||
raw := v.Interface()
|
if v.Type().Implements(closerType) {
|
||||||
if raw == nil {
|
closer = v.Interface().(io.Closer)
|
||||||
return nil
|
} 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 closer == nil {
|
||||||
if !ok && v.CanAddr() {
|
|
||||||
closer, ok = v.Addr().Interface().(io.Closer)
|
|
||||||
}
|
|
||||||
if !ok {
|
|
||||||
return reflectwalk.SkipEntry
|
return reflectwalk.SkipEntry
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue