1 // Copyright 2009 The Go Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style
3 // license that can be found in the LICENSE file.
5 //go:build aix || darwin || dragonfly || freebsd || hurd || linux || netbsd || openbsd || solaris
11 "internal/unsafeheader"
24 darwin64Bit
= (runtime
.GOOS
== "darwin" || runtime
.GOOS
== "ios") && sizeofPtr
== 8
25 netbsd32Bit
= runtime
.GOOS
== "netbsd" && sizeofPtr
== 4
28 // clen returns the index of the first NULL byte in n or len(n) if n contains no NULL byte.
29 func clen(n
[]byte) int {
30 for i
:= 0; i
< len(n
); i
++ {
38 // Mmap manager, for use by operating system-specific implementations.
39 // Gccgo only has one implementation but we do this to correspond to gc.
43 active
map[*byte][]byte // active mappings; key is last byte in mapping
44 mmap
func(addr
, length
uintptr, prot
, flags
, fd
int, offset
int64) (uintptr, error
)
45 munmap
func(addr
uintptr, length
uintptr) error
48 func (m
*mmapper
) Mmap(fd
int, offset
int64, length
int, prot
int, flags
int) (data
[]byte, err error
) {
53 // Map the requested memory.
54 addr
, errno
:= m
.mmap(0, uintptr(length
), prot
, flags
, fd
, offset
)
59 // Use unsafe to turn addr into a []byte.
61 hdr
:= (*unsafeheader
.Slice
)(unsafe
.Pointer(&b
))
62 hdr
.Data
= unsafe
.Pointer(addr
)
66 // Register mapping in m and return it.
74 func (m
*mmapper
) Munmap(data
[]byte) (err error
) {
75 if len(data
) == 0 ||
len(data
) != cap(data
) {
79 // Find the base of the mapping.
80 p
:= &data
[cap(data
)-1]
84 if b
== nil ||
&b
[0] != &data
[0] {
88 // Unmap the memory and update m.
89 if errno
:= m
.munmap(uintptr(unsafe
.Pointer(&b
[0])), uintptr(len(b
))); errno
!= nil {
96 var mapper
= &mmapper
{
97 active
: make(map[*byte][]byte),
102 func Mmap(fd
int, offset
int64, length
int, prot
int, flags
int) (data
[]byte, err error
) {
103 return mapper
.Mmap(fd
, offset
, length
, prot
, flags
)
106 func Munmap(b
[]byte) (err error
) {
107 return mapper
.Munmap(b
)
110 // Do the interface allocations only once for common
113 errEAGAIN error
= EAGAIN
114 errEINVAL error
= EINVAL
115 errENOENT error
= ENOENT
118 // errnoErr returns common boxed Errno values, to prevent
119 // allocations at runtime.
120 func errnoErr(e Errno
) error
{
134 // A Signal is a number describing a process signal.
135 // It implements the os.Signal interface.
138 func (s Signal
) Signal() {}
140 func Signame(s Signal
) string
142 func (s Signal
) String() string {
146 func Read(fd
int, p
[]byte) (n
int, err error
) {
150 race
.WriteRange(unsafe
.Pointer(&p
[0]), n
)
153 race
.Acquire(unsafe
.Pointer(&ioSync
))
156 if msanenabled
&& n
> 0 {
157 msanWrite(unsafe
.Pointer(&p
[0]), n
)
159 if asanenabled
&& n
> 0 {
160 asanWrite(unsafe
.Pointer(&p
[0]), n
)
165 func Write(fd
int, p
[]byte) (n
int, err error
) {
167 race
.ReleaseMerge(unsafe
.Pointer(&ioSync
))
169 if faketime
&& (fd
== 1 || fd
== 2) {
170 n
= faketimeWrite(fd
, p
)
172 n
, err
= 0, errnoErr(Errno(-n
))
175 n
, err
= write(fd
, p
)
177 if race
.Enabled
&& n
> 0 {
178 race
.ReadRange(unsafe
.Pointer(&p
[0]), n
)
180 if msanenabled
&& n
> 0 {
181 msanRead(unsafe
.Pointer(&p
[0]), n
)
183 if asanenabled
&& n
> 0 {
184 asanRead(unsafe
.Pointer(&p
[0]), n
)