diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/api/demo/styles/Home.module.css | 1 | ||||
-rw-r--r-- | src/js_printer.zig | 58 | ||||
-rw-r--r-- | src/watcher.zig | 62 |
3 files changed, 80 insertions, 41 deletions
diff --git a/src/api/demo/styles/Home.module.css b/src/api/demo/styles/Home.module.css index 35454bb74..a2a622da0 100644 --- a/src/api/demo/styles/Home.module.css +++ b/src/api/demo/styles/Home.module.css @@ -119,3 +119,4 @@ flex-direction: column; } } + diff --git a/src/js_printer.zig b/src/js_printer.zig index 1419dbef2..956a00e83 100644 --- a/src/js_printer.zig +++ b/src/js_printer.zig @@ -3964,9 +3964,45 @@ const FileWriterInternal = struct { ctx: *FileWriterInternal, ) anyerror!void { defer buffer.reset(); - const result = buffer.toOwnedSliceLeaky(); + var result_ = buffer.toOwnedSliceLeaky(); + var result = result_; + + while (result.len > 0) { + switch (result.len) { + 0...4096 => { + const written = try ctx.file.write(result); + if (written == 0 or result.len - written == 0) return; + result = result[written..]; + }, + else => { + const first = result.ptr[0..result.len / 3]; + const second = result[first.len..][0..first.len]; + const remain = first.len+second.len; + const third: []const u8 = result[remain..]; + + var vecs = [_]std.os.iovec_const{ + .{ + .iov_base = first.ptr, + .iov_len = first.len, + }, + .{ + .iov_base = second.ptr, + .iov_len = second.len, + }, + .{ + .iov_base = third.ptr, + .iov_len = third.len, + }, + }; - _ = try ctx.file.writeAll(result); + const written = try std.os.writev(ctx.file.handle, vecs[0..@as(usize, if(third.len > 0) 3 else 2)]); + if (written == 0 or result.len - written == 0) return; + result = result[written..]; + }, + } + } + + } pub fn flush( @@ -4202,14 +4238,20 @@ pub fn printCommonJSThreaded( defer lock.unlock(); lock.lock(); result.off = @truncate(u32, try getPos(getter)); - if (comptime isMac) { + if (comptime isMac or isLinux) { // Don't bother preallocate the file if it's less than 1 KB. Preallocating is potentially two syscalls if (printer.writer.written > 1024) { - try C.preallocate_file( - getter.handle, - @intCast(std.os.off_t, 0), - @intCast(std.os.off_t, printer.writer.written), - ); + if (comptime isMac) { + try C.preallocate_file( + getter.handle, + @intCast(std.os.off_t, 0), + @intCast(std.os.off_t, printer.writer.written), + ); + } + + if (comptime isLinux) { + _ = std.os.system.fallocate(getter.handle, 0, @intCast(i64, result.off), printer.writer.written); + } } } try printer.writer.done(); diff --git a/src/watcher.zig b/src/watcher.zig index f088d31d2..81fb3ab0f 100644 --- a/src/watcher.zig +++ b/src/watcher.zig @@ -68,18 +68,17 @@ pub const INotify = struct { pub fn watchPath(pathname: [:0]const u8) !EventListIndex { std.debug.assert(loaded_inotify); const old_count = watch_count.fetchAdd(1, .Release); - defer if (old_count == 0) std.Thread.Futex.wake(&watch_count, 10); + defer if (old_count == 0) std.Thread.Futex.wake(&watch_count, 10); return std.os.inotify_add_watchZ(inotify_fd, pathname, watch_file_mask); } pub fn watchDir(pathname: [:0]const u8) !EventListIndex { std.debug.assert(loaded_inotify); const old_count = watch_count.fetchAdd(1, .Release); - defer if (old_count == 0) std.Thread.Futex.wake(&watch_count, 10); + defer if (old_count == 0) std.Thread.Futex.wake(&watch_count, 10); return std.os.inotify_add_watchZ(inotify_fd, pathname, watch_dir_mask); } - pub fn unwatch(wd: EventListIndex) void { std.debug.assert(loaded_inotify); _ = watch_count.fetchSub(1, .Release); @@ -97,43 +96,40 @@ pub const INotify = struct { std.debug.assert(loaded_inotify); restart: while (true) { + std.Thread.Futex.wait(&watch_count,0, null) catch unreachable; + const rc = std.os.system.read( + inotify_fd, + @ptrCast([*]u8, @alignCast(@alignOf([*]u8), &eventlist)), + @sizeOf(EventListBuffer), + ); + switch (std.os.errno(rc)) { + .SUCCESS => { + const len = @intCast(usize, rc); - std.Thread.Futex.wait(&watch_count,0, null) catch unreachable; - const rc = std.os.system.read( - inotify_fd, - @ptrCast([*]u8, @alignCast(@alignOf([*]u8), &eventlist)), - @sizeOf(EventListBuffer), - ); - - switch (std.os.errno(rc)) { - .SUCCESS => { - const len = @intCast(usize, rc); + if (len == 0) return &[_]*INotifyEvent{}; - if (len == 0) return &[_]*INotifyEvent{}; + var count: u32 = 0; + var i: u32 = 0; + while (i < len) : (i += @sizeOf(INotifyEvent)) { + const event = @ptrCast(*const INotifyEvent, @alignCast(@alignOf(*const INotifyEvent), eventlist[i..][0..@sizeOf(INotifyEvent)])); + if (event.name_len > 0) { + i += event.name_len; + } - var count: u32 = 0; - var i: u32 = 0; - while (i < len) : (i += @sizeOf(INotifyEvent)) { - const event = @ptrCast(*const INotifyEvent, @alignCast(@alignOf(*const INotifyEvent), eventlist[i..][0..@sizeOf(INotifyEvent)])); - if (event.name_len > 0) { - i += event.name_len; + eventlist_ptrs[count] = event; + count += 1; } - eventlist_ptrs[count] = event; - count += 1; - } - - return eventlist_ptrs[0..count]; - }, - .AGAIN => continue :restart, - .INVAL => return error.ShortRead, - .BADF => return error.INotifyFailedToStart, - - else => unreachable, - } + return eventlist_ptrs[0..count]; + }, + .AGAIN => continue :restart, + .INVAL => return error.ShortRead, + .BADF => return error.INotifyFailedToStart, -} + else => unreachable, + } + } unreachable; } |