Skip to content

Commit b090860

Browse files
committed
implementation
1 parent f9db373 commit b090860

File tree

3 files changed

+57
-1
lines changed

3 files changed

+57
-1
lines changed

unix/syscall_linux.go

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2130,6 +2130,7 @@ var mapper = &mmapper{
21302130
active: make(map[*byte][]byte),
21312131
mmap: mmap,
21322132
munmap: munmap,
2133+
mremap: mremap,
21332134
}
21342135

21352136
func Mmap(fd int, offset int64, length int, prot int, flags int) (data []byte, err error) {
@@ -2140,6 +2141,14 @@ func Munmap(b []byte) (err error) {
21402141
return mapper.Munmap(b)
21412142
}
21422143

2144+
func Mremap(oldData []byte, newData []byte, flags int) (data []byte, err error) {
2145+
return mapper.Mremap(oldData, newData, flags)
2146+
}
2147+
2148+
func Mremap2(oldData []byte, newLength int, flags int) (data []byte, err error) {
2149+
return mapper.Mremap2(oldData, newLength, flags)
2150+
}
2151+
21432152
//sys Madvise(b []byte, advice int) (err error)
21442153
//sys Mprotect(b []byte, prot int) (err error)
21452154
//sys Mlock(b []byte) (err error)

unix/syscall_unix.go

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,7 @@ 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)
104105
}
105106

106107
func (m *mmapper) Mmap(fd int, offset int64, length int, prot int, flags int) (data []byte, err error) {
@@ -147,6 +148,52 @@ func (m *mmapper) Munmap(data []byte) (err error) {
147148
return nil
148149
}
149150

151+
func (m *mmapper) Mremap(oldData []byte, newData []byte, flags int) (data []byte, err error) {
152+
if len(oldData) == 0 || len(oldData) != cap(oldData) || len(newData) == 0 || len(newData) != cap(newData) {
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(len(newData)), flags, uintptr(unsafe.Pointer(&newData[0])))
164+
if errno != nil {
165+
return nil, errno
166+
}
167+
bNew := unsafe.Slice((*byte)(unsafe.Pointer(newAddr)), len(newData))
168+
pNew := &bNew[cap(bNew)-1]
169+
m.active[pNew] = bNew
170+
delete(m.active, pOld)
171+
return bNew, nil
172+
}
173+
174+
func (m *mmapper) Mremap2(oldData []byte, newLength int, flags int) (data []byte, err error) {
175+
if newLength <= 0 || len(oldData) == 0 || len(oldData) != cap(oldData) {
176+
return nil, EINVAL
177+
}
178+
179+
pOld := &oldData[cap(oldData)-1]
180+
m.Lock()
181+
defer m.Unlock()
182+
bOld := m.active[pOld]
183+
if bOld == nil || &bOld[0] != &oldData[0] {
184+
return nil, EINVAL
185+
}
186+
newAddr, errno := m.mremap(uintptr(unsafe.Pointer(&bOld[0])), uintptr(len(bOld)), uintptr(newLength), flags, 0)
187+
if errno != nil {
188+
return nil, errno
189+
}
190+
bNew := unsafe.Slice((*byte)(unsafe.Pointer(newAddr)), newLength)
191+
pNew := &bNew[cap(bNew)-1]
192+
m.active[pNew] = bNew
193+
delete(m.active, pOld)
194+
return bNew, nil
195+
}
196+
150197
func Read(fd int, p []byte) (n int, err error) {
151198
n, err = read(fd, p)
152199
if raceenabled {

unix/zsyscall_linux.go

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)