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

View File

@ -24,7 +24,7 @@ type file struct {
fd int
name string
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.

View File

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