mirror of
https://github.com/oven-sh/bun
synced 2026-02-11 03:18:53 +00:00
expose mmap size and offset option (#141)
* expose mmap size and offset option * fix panics
This commit is contained in:
@@ -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| {
|
||||
|
||||
@@ -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;
|
||||
|
||||
const map = switch (mmap(null, @intCast(usize, size), os.PROT.READ | os.PROT.WRITE, flags, fd, 0)) {
|
||||
if (wanted_size) |size_| size = @minimum(size, size_);
|
||||
|
||||
const map = switch (mmap(null, size, os.PROT.READ | os.PROT.WRITE, flags, fd, offset)) {
|
||||
.result => |map| map,
|
||||
|
||||
.err => |err| {
|
||||
|
||||
Reference in New Issue
Block a user