Skip to content

Commit e475cf2

Browse files
syscall: add race annotations to Windows ReadFile and WriteFile
For #51618 Fixes #51673 Change-Id: Ie63408d62303293d80afed8d5cf1cb164a8abecc Reviewed-on: https://go-review.googlesource.com/c/go/+/392774 Trust: Ian Lance Taylor <[email protected]> Run-TryBot: Ian Lance Taylor <[email protected]> Reviewed-by: Keith Randall <[email protected]> TryBot-Result: Gopher Robot <[email protected]>
1 parent 49f1662 commit e475cf2

File tree

2 files changed

+34
-24
lines changed

2 files changed

+34
-24
lines changed

src/syscall/syscall_windows.go

Lines changed: 32 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -202,8 +202,8 @@ func NewCallbackCDecl(fn any) uintptr {
202202
//sys formatMessage(flags uint32, msgsrc uintptr, msgid uint32, langid uint32, buf []uint16, args *byte) (n uint32, err error) = FormatMessageW
203203
//sys ExitProcess(exitcode uint32)
204204
//sys CreateFile(name *uint16, access uint32, mode uint32, sa *SecurityAttributes, createmode uint32, attrs uint32, templatefile int32) (handle Handle, err error) [failretval==InvalidHandle] = CreateFileW
205-
//sys ReadFile(handle Handle, buf []byte, done *uint32, overlapped *Overlapped) (err error)
206-
//sys WriteFile(handle Handle, buf []byte, done *uint32, overlapped *Overlapped) (err error)
205+
//sys readFile(handle Handle, buf []byte, done *uint32, overlapped *Overlapped) (err error) = ReadFile
206+
//sys writeFile(handle Handle, buf []byte, done *uint32, overlapped *Overlapped) (err error) = WriteFile
207207
//sys SetFilePointer(handle Handle, lowoffset int32, highoffsetptr *int32, whence uint32) (newlowoffset uint32, err error) [failretval==0xffffffff]
208208
//sys CloseHandle(handle Handle) (err error)
209209
//sys GetStdHandle(stdhandle int) (handle Handle, err error) [failretval==InvalidHandle]
@@ -385,40 +385,50 @@ func Read(fd Handle, p []byte) (n int, err error) {
385385
}
386386
return 0, e
387387
}
388+
return int(done), nil
389+
}
390+
391+
func Write(fd Handle, p []byte) (n int, err error) {
392+
var done uint32
393+
e := WriteFile(fd, p, &done, nil)
394+
if e != nil {
395+
return 0, e
396+
}
397+
return int(done), nil
398+
}
399+
400+
func ReadFile(fd Handle, p []byte, done *uint32, overlapped *Overlapped) error {
401+
err := readFile(fd, p, done, overlapped)
388402
if race.Enabled {
389-
if done > 0 {
390-
race.WriteRange(unsafe.Pointer(&p[0]), int(done))
403+
if *done > 0 {
404+
race.WriteRange(unsafe.Pointer(&p[0]), int(*done))
391405
}
392406
race.Acquire(unsafe.Pointer(&ioSync))
393407
}
394-
if msanenabled && done > 0 {
395-
msanWrite(unsafe.Pointer(&p[0]), int(done))
408+
if msanenabled && *done > 0 {
409+
msanWrite(unsafe.Pointer(&p[0]), int(*done))
396410
}
397-
if asanenabled && done > 0 {
398-
asanWrite(unsafe.Pointer(&p[0]), int(done))
411+
if asanenabled && *done > 0 {
412+
asanWrite(unsafe.Pointer(&p[0]), int(*done))
399413
}
400-
return int(done), nil
414+
return err
401415
}
402416

403-
func Write(fd Handle, p []byte) (n int, err error) {
417+
func WriteFile(fd Handle, p []byte, done *uint32, overlapped *Overlapped) error {
404418
if race.Enabled {
405419
race.ReleaseMerge(unsafe.Pointer(&ioSync))
406420
}
407-
var done uint32
408-
e := WriteFile(fd, p, &done, nil)
409-
if e != nil {
410-
return 0, e
411-
}
412-
if race.Enabled && done > 0 {
413-
race.ReadRange(unsafe.Pointer(&p[0]), int(done))
421+
err := writeFile(fd, p, done, overlapped)
422+
if race.Enabled && *done > 0 {
423+
race.ReadRange(unsafe.Pointer(&p[0]), int(*done))
414424
}
415-
if msanenabled && done > 0 {
416-
msanRead(unsafe.Pointer(&p[0]), int(done))
425+
if msanenabled && *done > 0 {
426+
msanRead(unsafe.Pointer(&p[0]), int(*done))
417427
}
418-
if asanenabled && done > 0 {
419-
asanRead(unsafe.Pointer(&p[0]), int(done))
428+
if asanenabled && *done > 0 {
429+
asanRead(unsafe.Pointer(&p[0]), int(*done))
420430
}
421-
return int(done), nil
431+
return err
422432
}
423433

424434
var ioSync int64

src/syscall/zsyscall_windows.go

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)