aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/api/demo/styles/Home.module.css1
-rw-r--r--src/js_printer.zig58
-rw-r--r--src/watcher.zig62
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;
}