Commit 0607cdda authored by Austin Clements's avatar Austin Clements

syscall: redirect writes to runtime.write in faketime mode

If the faketime build tag is set, this causes syscall.Write for FDs 1
and 2 to redirect to runtime.write, since that's where we'll apply the
faketime framing. This is equivalent to what nacl currently does in
naclFile.write.

We do this on all of the platforms except nacl, which has its own
faketime support and we're about to remove, and Windows, which would
require other changes to support faketime so we're leaving alone for
now.

Updates #30439.

Change-Id: I138a5ca63577d92d15b5437d037bd3159fa84ee7
Reviewed-on: https://go-review.googlesource.com/c/go/+/192739
Run-TryBot: Austin Clements <austin@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: default avatarBrad Fitzpatrick <bradfitz@golang.org>
Reviewed-by: default avatarIan Lance Taylor <iant@golang.org>
parent 4af3c17f
...@@ -404,6 +404,14 @@ func Write(fd int, b []byte) (int, error) { ...@@ -404,6 +404,14 @@ func Write(fd int, b []byte) (int, error) {
return n, err return n, err
} }
if faketime && (fd == 1 || fd == 2) {
n := faketimeWrite(fd, b)
if n < 0 {
return 0, errnoErr(Errno(-n))
}
return n, nil
}
buf := uint8Array.New(len(b)) buf := uint8Array.New(len(b))
js.CopyBytesToJS(buf, b) js.CopyBytesToJS(buf, b)
n, err := fsCall("write", fd, buf, 0, len(b), nil) n, err := fsCall("write", fd, buf, 0, len(b), nil)
......
...@@ -167,6 +167,14 @@ func Read(fd int, p []byte) (n int, err error) { ...@@ -167,6 +167,14 @@ func Read(fd int, p []byte) (n int, err error) {
} }
func Write(fd int, p []byte) (n int, err error) { func Write(fd int, p []byte) (n int, err error) {
if faketime && (fd == 1 || fd == 2) {
n = faketimeWrite(fd, p)
if n < 0 {
return 0, ErrorString("error")
}
return n, nil
}
return Pwrite(fd, p, -1) return Pwrite(fd, p, -1)
} }
......
...@@ -205,7 +205,14 @@ func Write(fd int, p []byte) (n int, err error) { ...@@ -205,7 +205,14 @@ func Write(fd int, p []byte) (n int, err error) {
if race.Enabled { if race.Enabled {
race.ReleaseMerge(unsafe.Pointer(&ioSync)) race.ReleaseMerge(unsafe.Pointer(&ioSync))
} }
n, err = write(fd, p) if faketime && (fd == 1 || fd == 2) {
n = faketimeWrite(fd, p)
if n < 0 {
n, err = 0, errnoErr(Errno(-n))
}
} else {
n, err = write(fd, p)
}
if race.Enabled && n > 0 { if race.Enabled && n > 0 {
race.ReadRange(unsafe.Pointer(&p[0]), n) race.ReadRange(unsafe.Pointer(&p[0]), n)
} }
......
// Copyright 2019 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
// +build faketime
package syscall
import "unsafe"
const faketime = true
// When faketime is enabled, we redirect writes to FDs 1 and 2 through
// the runtime's write function, since that adds the framing that
// reports the emulated time.
//go:linkname runtimeWrite runtime.write
func runtimeWrite(fd uintptr, p unsafe.Pointer, n int32) int32
func faketimeWrite(fd int, p []byte) int {
var pp *byte
if len(p) > 0 {
pp = &p[0]
}
return int(runtimeWrite(uintptr(fd), unsafe.Pointer(pp), int32(len(p))))
}
// Copyright 2019 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
// +build !faketime
package syscall
const faketime = false
func faketimeWrite(fd int, p []byte) int {
// This should never be called since faketime is false.
panic("not implemented")
}
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