Skip to content

Commit

Permalink
Merge pull request hashicorp#15501 from hashicorp/jbardin/race
Browse files Browse the repository at this point in the history
Make sure shadow.closeWalker doesn't copy Mutexes
  • Loading branch information
jbardin authored Jul 7, 2017
2 parents ac9abf5 + 6579322 commit 8e2ee53
Showing 1 changed file with 12 additions and 9 deletions.
21 changes: 12 additions & 9 deletions helper/shadow/closer.go
Original file line number Diff line number Diff line change
Expand Up @@ -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() {
Expand All @@ -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
}

Expand Down

0 comments on commit 8e2ee53

Please sign in to comment.