| // 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. | |
| //go:build !faketime | |
| package runtime | |
| import "unsafe" | |
| // faketime is the simulated time in nanoseconds since 1970 for the | |
| // playground. | |
| // | |
| // Zero means not to use faketime. | |
| var faketime int64 | |
| // Exported via linkname for use by time and internal/poll. | |
| // | |
| // Many external packages also linkname nanotime for a fast monotonic time. | |
| // Such code should be updated to use: | |
| // | |
| // var start = time.Now() // at init time | |
| // | |
| // and then replace nanotime() with time.Since(start), which is equally fast. | |
| // | |
| // However, all the code linknaming nanotime is never going to go away. | |
| // Do not remove or change the type signature. | |
| // See go.dev/issue/67401. | |
| // | |
| //go:linkname nanotime | |
| //go:nosplit | |
| func nanotime() int64 { | |
| return nanotime1() | |
| } | |
| // overrideWrite allows write to be redirected externally, by | |
| // linkname'ing this and set it to a write function. | |
| // | |
| // overrideWrite should be an internal detail, | |
| // but widely used packages access it using linkname. | |
| // Notable members of the hall of shame include: | |
| // - golang.zx2c4.com/wireguard/windows | |
| // | |
| // Do not remove or change the type signature. | |
| // See go.dev/issue/67401. | |
| // | |
| //go:linkname overrideWrite | |
| var overrideWrite func(fd uintptr, p unsafe.Pointer, n int32) int32 | |
| // write must be nosplit on Windows (see write1) | |
| // | |
| //go:nosplit | |
| func write(fd uintptr, p unsafe.Pointer, n int32) int32 { | |
| if overrideWrite != nil { | |
| return overrideWrite(fd, noescape(p), n) | |
| } | |
| return write1(fd, p, n) | |
| } |