Skip to content

Commit 7598fa3

Browse files
committed
moved mremap mapper to a separate file
1 parent ee52c47 commit 7598fa3

File tree

3 files changed

+46
-30
lines changed

3 files changed

+46
-30
lines changed

unix/mremap.go

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
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.
4+
5+
//go:build linux
6+
// +build linux
7+
8+
package unix
9+
10+
import "unsafe"
11+
12+
type mremapMmapper struct {
13+
mmapper
14+
mremap func(oldaddr uintptr, oldlength uintptr, newlength uintptr, flags int, newaddr uintptr) (xaddr uintptr, err error)
15+
}
16+
17+
func (m *mremapMmapper) Mremap(oldData []byte, newLength int, flags int) (data []byte, err error) {
18+
if newLength <= 0 || len(oldData) == 0 || len(oldData) != cap(oldData) {
19+
return nil, EINVAL
20+
}
21+
22+
pOld := &oldData[cap(oldData)-1]
23+
m.Lock()
24+
defer m.Unlock()
25+
bOld := m.active[pOld]
26+
if bOld == nil || &bOld[0] != &oldData[0] {
27+
return nil, EINVAL
28+
}
29+
newAddr, errno := m.mremap(uintptr(unsafe.Pointer(&bOld[0])), uintptr(len(bOld)), uintptr(newLength), flags, 0)
30+
if errno != nil {
31+
return nil, errno
32+
}
33+
bNew := unsafe.Slice((*byte)(unsafe.Pointer(newAddr)), newLength)
34+
pNew := &bNew[cap(bNew)-1]
35+
m.active[pNew] = bNew
36+
if flags&MREMAP_DONTUNMAP == 0 {
37+
delete(m.active, pOld)
38+
}
39+
return bNew, nil
40+
}

unix/syscall_linux.go

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2126,10 +2126,12 @@ func writevRacedetect(iovecs []Iovec, n int) {
21262126
//sys munmap(addr uintptr, length uintptr) (err error)
21272127
//sys mremap(oldaddr uintptr, oldlength uintptr, newlength uintptr, flags int, newaddr uintptr) (xaddr uintptr, err error)
21282128

2129-
var mapper = &mmapper{
2130-
active: make(map[*byte][]byte),
2131-
mmap: mmap,
2132-
munmap: munmap,
2129+
var mapper = &mremapMmapper{
2130+
mmapper: mmapper{
2131+
active: make(map[*byte][]byte),
2132+
mmap: mmap,
2133+
munmap: munmap,
2134+
},
21332135
mremap: mremap,
21342136
}
21352137

unix/syscall_unix.go

Lines changed: 0 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,6 @@ type mmapper struct {
101101
active map[*byte][]byte // active mappings; key is last byte in mapping
102102
mmap func(addr, length uintptr, prot, flags, fd int, offset int64) (uintptr, error)
103103
munmap func(addr uintptr, length uintptr) error
104-
mremap func(oldaddr uintptr, oldlength uintptr, newlength uintptr, flags int, newaddr uintptr) (xaddr uintptr, err error)
105104
}
106105

107106
func (m *mmapper) Mmap(fd int, offset int64, length int, prot int, flags int) (data []byte, err error) {
@@ -148,31 +147,6 @@ func (m *mmapper) Munmap(data []byte) (err error) {
148147
return nil
149148
}
150149

151-
func (m *mmapper) Mremap(oldData []byte, newLength int, flags int) (data []byte, err error) {
152-
if newLength <= 0 || len(oldData) == 0 || len(oldData) != cap(oldData) {
153-
return nil, EINVAL
154-
}
155-
156-
pOld := &oldData[cap(oldData)-1]
157-
m.Lock()
158-
defer m.Unlock()
159-
bOld := m.active[pOld]
160-
if bOld == nil || &bOld[0] != &oldData[0] {
161-
return nil, EINVAL
162-
}
163-
newAddr, errno := m.mremap(uintptr(unsafe.Pointer(&bOld[0])), uintptr(len(bOld)), uintptr(newLength), flags, 0)
164-
if errno != nil {
165-
return nil, errno
166-
}
167-
bNew := unsafe.Slice((*byte)(unsafe.Pointer(newAddr)), newLength)
168-
pNew := &bNew[cap(bNew)-1]
169-
m.active[pNew] = bNew
170-
if flags&MREMAP_DONTUNMAP == 0 {
171-
delete(m.active, pOld)
172-
}
173-
return bNew, nil
174-
}
175-
176150
func Read(fd int, p []byte) (n int, err error) {
177151
n, err = read(fd, p)
178152
if raceenabled {

0 commit comments

Comments
 (0)