diff options
author | 2022-04-14 05:08:56 +0300 | |
---|---|---|
committer | 2022-04-13 19:08:56 -0700 | |
commit | 95aa76b9fae3747a72c2db460d42c38b7faaee2a (patch) | |
tree | 66bf3b12d432ddcfdd0e0fe6eb035aec80ab1194 | |
parent | 95101870e465c986b867fcf65b1f40b20266b9ab (diff) | |
download | bun-95aa76b9fae3747a72c2db460d42c38b7faaee2a.tar.gz bun-95aa76b9fae3747a72c2db460d42c38b7faaee2a.tar.zst bun-95aa76b9fae3747a72c2db460d42c38b7faaee2a.zip |
expose mmap size and offset option (#141)
* expose mmap size and offset option
* fix panics
-rw-r--r-- | src/javascript/jsc/api/bun.zig | 13 | ||||
-rw-r--r-- | src/javascript/jsc/node/syscall.zig | 10 |
2 files changed, 18 insertions, 5 deletions
diff --git a/src/javascript/jsc/api/bun.zig b/src/javascript/jsc/api/bun.zig index 660f2aba8..de85d6c8f 100644 --- a/src/javascript/jsc/api/bun.zig +++ b/src/javascript/jsc/api/bun.zig @@ -1619,18 +1619,29 @@ pub fn mmapFile( const file_flags: u32 = if (@hasDecl(std.os.MAP, "FILE")) std.os.MAP.FILE else 0; // Conforming applications must specify either MAP_PRIVATE or MAP_SHARED. + var offset: usize = 0; var flags = file_flags; + var map_size: ?usize = null; if (args.nextEat()) |opts| { const sync = opts.get(ctx.ptr(), "sync") orelse JSC.JSValue.jsBoolean(false); const shared = opts.get(ctx.ptr(), "shared") orelse JSC.JSValue.jsBoolean(true); flags |= @as(u32, if (sync.toBoolean()) sync_flags else 0); flags |= @as(u32, if (shared.toBoolean()) std.os.MAP.SHARED else std.os.MAP.PRIVATE); + + if (opts.get(ctx.ptr(), "size")) |value| { + map_size = @intCast(usize, value.toInt64()); + } + + if (opts.get(ctx.ptr(), "offset")) |value| { + offset = @intCast(usize, value.toInt64()); + offset = std.mem.alignBackwardAnyAlign(offset, std.mem.page_size); + } } else { flags |= std.os.MAP.SHARED; } - const map = switch (JSC.Node.Syscall.mmapFile(buf_z, flags)) { + const map = switch (JSC.Node.Syscall.mmapFile(buf_z, flags, map_size, offset)) { .result => |map| map, .err => |err| { diff --git a/src/javascript/jsc/node/syscall.zig b/src/javascript/jsc/node/syscall.zig index ac7d51d8b..3a9e3ddd4 100644 --- a/src/javascript/jsc/node/syscall.zig +++ b/src/javascript/jsc/node/syscall.zig @@ -486,21 +486,23 @@ fn mmap( return Maybe([]align(mem.page_size) u8){ .result = @ptrCast([*]align(mem.page_size) u8, @alignCast(mem.page_size, rc))[0..length] }; } -pub fn mmapFile(path: [:0]const u8, flags: u32) Maybe([]align(mem.page_size) u8) { +pub fn mmapFile(path: [:0]const u8, flags: u32, wanted_size: ?usize, offset: usize) Maybe([]align(mem.page_size) u8) { const fd = switch (open(path, os.O.RDWR, 0)) { .result => |fd| fd, .err => |err| return .{ .err = err }, }; - const size = switch (fstat(fd)) { + var size = std.math.sub(usize, @intCast(usize, switch (fstat(fd)) { .result => |result| result.size, .err => |err| { _ = close(fd); return .{ .err = err }; }, - }; + }), offset) catch 0; + + if (wanted_size) |size_| size = @minimum(size, size_); - const map = switch (mmap(null, @intCast(usize, size), os.PROT.READ | os.PROT.WRITE, flags, fd, 0)) { + const map = switch (mmap(null, size, os.PROT.READ | os.PROT.WRITE, flags, fd, offset)) { .result => |map| map, .err => |err| { |