os: fix race in ReadAt/WriteAt on Windows

R=bradfitzgo, rsc, peterGo
CC=golang-dev
https://golang.org/cl/4441051
This commit is contained in:
Alex Brainman 2011-04-26 18:09:46 +10:00
parent 2d99974ec5
commit b1deb3be7f
5 changed files with 147 additions and 46 deletions

View file

@ -250,27 +250,6 @@ func Read(fd int, p []byte) (n int, errno int) {
return int(done), 0
}
// TODO(brainman): ReadFile/WriteFile change file offset, therefore
// i use Seek here to preserve semantics of unix pread/pwrite,
// not sure if I should do that
func Pread(fd int, p []byte, offset int64) (n int, errno int) {
curoffset, e := Seek(fd, 0, 1)
if e != 0 {
return 0, e
}
defer Seek(fd, curoffset, 0)
var o Overlapped
o.OffsetHigh = uint32(offset >> 32)
o.Offset = uint32(offset)
var done uint32
e = ReadFile(int32(fd), p, &done, &o)
if e != 0 {
return 0, e
}
return int(done), 0
}
func Write(fd int, p []byte) (n int, errno int) {
var done uint32
e := WriteFile(int32(fd), p, &done, nil)
@ -280,23 +259,6 @@ func Write(fd int, p []byte) (n int, errno int) {
return int(done), 0
}
func Pwrite(fd int, p []byte, offset int64) (n int, errno int) {
curoffset, e := Seek(fd, 0, 1)
if e != 0 {
return 0, e
}
defer Seek(fd, curoffset, 0)
var o Overlapped
o.OffsetHigh = uint32(offset >> 32)
o.Offset = uint32(offset)
var done uint32
e = WriteFile(int32(fd), p, &done, &o)
if e != 0 {
return 0, e
}
return int(done), 0
}
func Seek(fd int, offset int64, whence int) (newoffset int64, errno int) {
var w uint32
switch whence {