]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: do not use heap arena hints on wasm
authorRichard Musiol <mail@richard-musiol.de>
Sun, 28 Apr 2019 10:16:44 +0000 (12:16 +0200)
committerRichard Musiol <neelance@gmail.com>
Tue, 30 Apr 2019 08:25:33 +0000 (08:25 +0000)
The address space of WebAssembly's linear memory is contiguous, so
requesting specific addresses is not supported. Do not use heap arena
hints so we do not have unused memory ranges.

This fixes go1 benchmarks on wasm which ran out of memory since
https://golang.org/cl/170950.

Change-Id: I70115b18dbe43abe16dd5f57996343d97bf94760
Reviewed-on: https://go-review.googlesource.com/c/go/+/174203
Run-TryBot: Richard Musiol <neelance@gmail.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Cherry Zhang <cherryyz@google.com>
src/runtime/mem_js.go

index fc6092b2bb92331966dc79dcbb93d1ba85ea1c2e..7da4beda2a75319f45544bb56c87f2ffe9d6e2c2 100644 (file)
@@ -41,13 +41,19 @@ var reserveEnd uintptr
 func sysReserve(v unsafe.Pointer, n uintptr) unsafe.Pointer {
        // TODO(neelance): maybe unify with mem_plan9.go, depending on how https://github.com/WebAssembly/design/blob/master/FutureFeatures.md#finer-grained-control-over-memory turns out
 
+       if v != nil {
+               // The address space of WebAssembly's linear memory is contiguous,
+               // so requesting specific addresses is not supported. We could use
+               // a different address, but then mheap.sysAlloc discards the result
+               // right away and we don't reuse chunks passed to sysFree.
+               return nil
+       }
+
        if reserveEnd < lastmoduledatap.end {
                reserveEnd = lastmoduledatap.end
        }
-       if uintptr(v) < reserveEnd {
-               v = unsafe.Pointer(reserveEnd)
-       }
-       reserveEnd = uintptr(v) + n
+       v = unsafe.Pointer(reserveEnd)
+       reserveEnd += n
 
        current := currentMemory()
        needed := int32(reserveEnd/sys.DefaultPhysPageSize + 1)