os: fix data race in epipecheck()

Fixes #3860.

R=golang-dev, adg
CC=golang-dev
https://golang.org/cl/6443051
This commit is contained in:
Dmitriy Vyukov 2012-07-27 15:05:13 +04:00
parent c49af2ccaf
commit ab9ccedefe
3 changed files with 4 additions and 5 deletions

View file

@ -7,6 +7,7 @@
package os package os
import ( import (
"sync/atomic"
"syscall" "syscall"
"time" "time"
) )
@ -15,12 +16,11 @@ func sigpipe() // implemented in package runtime
func epipecheck(file *File, e error) { func epipecheck(file *File, e error) {
if e == syscall.EPIPE { if e == syscall.EPIPE {
file.nepipe++ if atomic.AddInt32(&file.nepipe, 1) >= 10 {
if file.nepipe >= 10 {
sigpipe() sigpipe()
} }
} else { } else {
file.nepipe = 0 atomic.StoreInt32(&file.nepipe, 0)
} }
} }

View file

@ -24,7 +24,7 @@ type file struct {
fd int fd int
name string name string
dirinfo *dirInfo // nil unless directory being read dirinfo *dirInfo // nil unless directory being read
nepipe int // number of consecutive EPIPE in Write nepipe int32 // number of consecutive EPIPE in Write
} }
// Fd returns the integer Unix file descriptor referencing the open file. // Fd returns the integer Unix file descriptor referencing the open file.

View file

@ -25,7 +25,6 @@ type file struct {
fd syscall.Handle fd syscall.Handle
name string name string
dirinfo *dirInfo // nil unless directory being read dirinfo *dirInfo // nil unless directory being read
nepipe int // number of consecutive EPIPE in Write
l sync.Mutex // used to implement windows pread/pwrite l sync.Mutex // used to implement windows pread/pwrite
} }