diff options
Diffstat (limited to 'vendor/modernc.org/memory/mmap_unix.go')
| -rw-r--r-- | vendor/modernc.org/memory/mmap_unix.go | 18 |
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 } } |
