diff options
Diffstat (limited to '')
| -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;      } | 
