Commit ab9ccede authored by Dmitriy Vyukov's avatar Dmitriy Vyukov

os: fix data race in epipecheck()

Fixes #3860.

R=golang-dev, adg
CC=golang-dev
https://golang.org/cl/6443051
parent c49af2cc
......@@ -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)
}
}
......
......@@ -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.
......
......@@ -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
}
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment