mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
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:
parent
2d99974ec5
commit
b1deb3be7f
5 changed files with 147 additions and 46 deletions
|
|
@ -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 {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue