diff options
| author | Stefan Majewsky <majewsky@gmx.net> | 2023-10-25 14:40:11 +0200 |
|---|---|---|
| committer | Stefan Majewsky <majewsky@gmx.net> | 2023-10-25 14:40:11 +0200 |
| commit | 8ed9ced09964a0f70ffcadd0aa8d25c7bc339352 (patch) | |
| tree | 4aefd3d5280837d2547a980995a3aa1a9eda4cb5 /vendor/golang.org/x/sys/unix/mremap.go | |
| parent | f308ca92d1631e579fbfe3b3da13c93709dc18a2 (diff) | |
| download | gofu-8ed9ced09964a0f70ffcadd0aa8d25c7bc339352.tar.gz | |
bump all dependencies to their latest versions
Diffstat (limited to 'vendor/golang.org/x/sys/unix/mremap.go')
| -rw-r--r-- | vendor/golang.org/x/sys/unix/mremap.go | 53 |
1 files changed, 53 insertions, 0 deletions
diff --git a/vendor/golang.org/x/sys/unix/mremap.go b/vendor/golang.org/x/sys/unix/mremap.go new file mode 100644 index 0000000..fa93d0a --- /dev/null +++ b/vendor/golang.org/x/sys/unix/mremap.go @@ -0,0 +1,53 @@ +// Copyright 2023 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 linux || netbsd +// +build linux netbsd + +package unix + +import "unsafe" + +type mremapMmapper struct { + mmapper + mremap func(oldaddr uintptr, oldlength uintptr, newlength uintptr, flags int, newaddr uintptr) (xaddr uintptr, err error) +} + +var mapper = &mremapMmapper{ + mmapper: mmapper{ + active: make(map[*byte][]byte), + mmap: mmap, + munmap: munmap, + }, + mremap: mremap, +} + +func (m *mremapMmapper) Mremap(oldData []byte, newLength int, flags int) (data []byte, err error) { + if newLength <= 0 || len(oldData) == 0 || len(oldData) != cap(oldData) || flags&mremapFixed != 0 { + return nil, EINVAL + } + + pOld := &oldData[cap(oldData)-1] + m.Lock() + defer m.Unlock() + bOld := m.active[pOld] + if bOld == nil || &bOld[0] != &oldData[0] { + return nil, EINVAL + } + newAddr, errno := m.mremap(uintptr(unsafe.Pointer(&bOld[0])), uintptr(len(bOld)), uintptr(newLength), flags, 0) + if errno != nil { + return nil, errno + } + bNew := unsafe.Slice((*byte)(unsafe.Pointer(newAddr)), newLength) + pNew := &bNew[cap(bNew)-1] + if flags&mremapDontunmap == 0 { + delete(m.active, pOld) + } + m.active[pNew] = bNew + return bNew, nil +} + +func Mremap(oldData []byte, newLength int, flags int) (data []byte, err error) { + return mapper.Mremap(oldData, newLength, flags) +} |
