summaryrefslogtreecommitdiff
path: root/vendor/modernc.org/memory/mmap_unix.go
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/modernc.org/memory/mmap_unix.go')
-rw-r--r--vendor/modernc.org/memory/mmap_unix.go18
1 files changed, 12 insertions, 6 deletions
diff --git a/vendor/modernc.org/memory/mmap_unix.go b/vendor/modernc.org/memory/mmap_unix.go
index ef6c9a539..8ee991538 100644
--- a/vendor/modernc.org/memory/mmap_unix.go
+++ b/vendor/modernc.org/memory/mmap_unix.go
@@ -14,7 +14,7 @@ import (
"unsafe"
)
-const pageSizeLog = 20
+const pageSizeLog = 16
var (
osPageMask = osPageSize - 1
@@ -28,21 +28,23 @@ func unmap(addr uintptr, size int) error {
// pageSize aligned.
func mmap(size int) (uintptr, int, error) {
size = roundup(size, osPageSize)
- up, err := unix.MmapPtr(-1, 0, nil, uintptr(size+pageSize), unix.PROT_READ|unix.PROT_WRITE, unix.MAP_PRIVATE|unix.MAP_ANON)
+ // Ask for more so we can align the result at a pageSize boundary
+ n := size + pageSize
+ up, err := unix.MmapPtr(-1, 0, nil, uintptr(n), unix.PROT_READ|unix.PROT_WRITE, unix.MAP_PRIVATE|unix.MAP_ANON)
if err != nil {
return 0, 0, err
}
p := uintptr(up)
- n := size + pageSize
if p&uintptr(osPageMask) != 0 {
panic("internal error")
}
mod := int(p) & pageMask
- if mod != 0 {
+ if mod != 0 { // Return the extra part before pageSize aligned block
m := pageSize - mod
if err := unmap(p, m); err != nil {
+ unmap(p, n) // Do not leak the first mmap
return 0, 0, err
}
@@ -54,9 +56,13 @@ func mmap(size int) (uintptr, int, error) {
panic("internal error")
}
- if n-size != 0 {
+ if n > size { // Return the extra part after pageSize aligned block
if err := unmap(p+uintptr(size), n-size); err != nil {
- return 0, 0, err
+ // Do not error when the kernel rejects the extra part after, just return the
+ // unexpectedly enlarged size.
+ //
+ // Fixes the bigsort.test failures on linux/s390x, see: https://gitlab.com/cznic/sqlite/-/issues/207
+ size = n
}
}