summaryrefslogtreecommitdiff
path: root/vendor/modernc.org/memory
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/modernc.org/memory')
-rw-r--r--vendor/modernc.org/memory/memory.go6
-rw-r--r--vendor/modernc.org/memory/mmap_unix.go18
2 files changed, 18 insertions, 6 deletions
diff --git a/vendor/modernc.org/memory/memory.go b/vendor/modernc.org/memory/memory.go
index e25acda9b..6593c4234 100644
--- a/vendor/modernc.org/memory/memory.go
+++ b/vendor/modernc.org/memory/memory.go
@@ -109,6 +109,12 @@ func (a *Allocator) mmap(size int) (uintptr /* *page */, error) {
return 0, err
}
+ //TODO(jnml) The returned size may now be nearly as twice as large as we asked
+ //for. Use that extra capacity. For that we need to move the respective
+ //Allocator.cap item into the page struct so the page cap becomes dynamic.
+ //
+ // Related: This is a consequence of fixing the bigsort.test failures on
+ // linux/s390x, see: https://gitlab.com/cznic/sqlite/-/issues/207
if counters {
a.Mmaps++
a.Bytes += size
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
}
}