Skip to content

Commit 6db7204

Browse files
committed
Use mmap std.heap.page_allocator impl when compiling for Wasm + libc
When linking libc, it should be the libc that manages the heap. The main Wasm memory might have been configured as non-growable, which makes `WasmAllocator` a poor default and causes the common `DebugAllocator` use case fail with OOM errors unless the user uses `std_options` to override the default page allocator. Additionally, on Emscripten, growing Wasm memory without notifying the JS glue code will cause array buffers to get detached and lead to spurious crashes.
1 parent 47d6143 commit 6db7204

File tree

3 files changed

+14
-12
lines changed

3 files changed

+14
-12
lines changed

lib/std/c.zig

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1811,7 +1811,16 @@ pub const POLL = switch (native_os) {
18111811
/// Basic memory protection flags
18121812
pub const PROT = switch (native_os) {
18131813
.linux => linux.PROT,
1814-
.emscripten => emscripten.PROT,
1814+
// https://github.com/emscripten-core/emscripten/blob/08e2de1031913e4ba7963b1c56f35f036a7d4d56/system/lib/libc/musl/include/sys/mman.h#L57-L62
1815+
// lib/libc/include/wasm-wasi-musl/sys/mman.h
1816+
.emscripten, .wasi => struct {
1817+
pub const NONE = 0;
1818+
pub const READ = 1;
1819+
pub const WRITE = 2;
1820+
pub const EXEC = 4;
1821+
pub const GROWSDOWN = 0x01000000;
1822+
pub const GROWSUP = 0x02000000;
1823+
},
18151824
// https://github.com/SerenityOS/serenity/blob/6d59d4d3d9e76e39112842ec487840828f1c9bfe/Kernel/API/POSIX/sys/mman.h#L28-L31
18161825
.openbsd, .haiku, .dragonfly, .netbsd, .illumos, .freebsd, .windows, .serenity => struct {
18171826
/// page can not be accessed
@@ -8647,7 +8656,9 @@ pub const O = switch (native_os) {
86478656

86488657
pub const MAP = switch (native_os) {
86498658
.linux => linux.MAP,
8650-
.emscripten => packed struct(u32) {
8659+
// https://github.com/emscripten-core/emscripten/blob/08e2de1031913e4ba7963b1c56f35f036a7d4d56/system/lib/libc/musl/include/sys/mman.h#L21-L39
8660+
// lib/libc/include/wasm-wasi-musl/sys/mman.h
8661+
.emscripten, .wasi => packed struct(u32) {
86518662
TYPE: enum(u4) {
86528663
SHARED = 0x01,
86538664
PRIVATE = 0x02,

lib/std/heap.zig

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -356,7 +356,7 @@ pub const page_allocator: Allocator = if (@hasDecl(root, "os") and
356356
@hasDecl(root.os, "heap") and
357357
@hasDecl(root.os.heap, "page_allocator"))
358358
root.os.heap.page_allocator
359-
else if (builtin.target.cpu.arch.isWasm()) .{
359+
else if (builtin.target.cpu.arch.isWasm() and !builtin.link_libc) .{
360360
.ptr = undefined,
361361
.vtable = &WasmAllocator.vtable,
362362
} else if (builtin.target.os.tag == .plan9) .{

lib/std/os/emscripten.zig

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -331,15 +331,6 @@ pub const POLL = struct {
331331
pub const RDBAND = 0x080;
332332
};
333333

334-
pub const PROT = struct {
335-
pub const NONE = 0x0;
336-
pub const READ = 0x1;
337-
pub const WRITE = 0x2;
338-
pub const EXEC = 0x4;
339-
pub const GROWSDOWN = 0x01000000;
340-
pub const GROWSUP = 0x02000000;
341-
};
342-
343334
pub const rlim_t = u64;
344335

345336
pub const RLIM = struct {

0 commit comments

Comments
 (0)