authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2025-06-03 22:42:53-07:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2025-07-01 16:35:29-07:00
logb393112674d0b948832c3223d5b300f080c71151
tree97392fff3cc17dc563f4a9cf54f5f1326e7b8d07
parent9d163c7ac3fbc6adfa7c6fa299647d0731f96167

std: update uses of unbuffered_writer


6 files changed, 39 insertions(+), 90 deletions(-)

lib/std/Progress.zig+7-9
...@@ -608,12 +608,10 @@ pub fn unlockStdErr() void {...@@ -608,12 +608,10 @@ pub fn unlockStdErr() void {
608}608}
609609
610/// Protected by `stderr_mutex`.610/// Protected by `stderr_mutex`.
611var stderr_buffered_writer: Writer = .{611const stderr_writer: *Writer = &stderr_file_writer.interface;
612 .unbuffered_writer = stderr_file_writer.interface(),
613 .buffer = &.{},
614};
615/// Protected by `stderr_mutex`.612/// Protected by `stderr_mutex`.
616var stderr_file_writer: std.fs.File.Writer = .{613var stderr_file_writer: std.fs.File.Writer = .{
614 .interface = std.fs.File.Writer.init_interface(&.{}),
617 .file = if (is_windows) undefined else .stderr(),615 .file = if (is_windows) undefined else .stderr(),
618 .mode = .streaming,616 .mode = .streaming,
619};617};
...@@ -628,14 +626,14 @@ pub fn lockStderrWriter(buffer: []u8) *Writer {...@@ -628,14 +626,14 @@ pub fn lockStderrWriter(buffer: []u8) *Writer {
628 stderr_mutex.lock();626 stderr_mutex.lock();
629 clearWrittenWithEscapeCodes() catch {};627 clearWrittenWithEscapeCodes() catch {};
630 if (is_windows) stderr_file_writer.file = .stderr();628 if (is_windows) stderr_file_writer.file = .stderr();
631 stderr_buffered_writer.flush() catch {};629 stderr_writer.flush() catch {};
632 stderr_buffered_writer.buffer = buffer;630 stderr_writer.buffer = buffer;
633 return &stderr_buffered_writer;631 return &stderr_writer;
634}632}
635633
636pub fn unlockStderrWriter() void {634pub fn unlockStderrWriter() void {
637 stderr_buffered_writer.flush() catch {};635 stderr_writer.flush() catch {};
638 stderr_buffered_writer.buffer = &.{};636 stderr_writer.buffer = &.{};
639 stderr_mutex.unlock();637 stderr_mutex.unlock();
640}638}
641639
lib/std/crypto/phc_encoding.zig+3-6
...@@ -197,12 +197,9 @@ pub fn serialize(params: anytype, str: []u8) Error![]const u8 {...@@ -197,12 +197,9 @@ pub fn serialize(params: anytype, str: []u8) Error![]const u8 {
197/// Compute the number of bytes required to serialize `params`197/// Compute the number of bytes required to serialize `params`
198pub fn calcSize(params: anytype) usize {198pub fn calcSize(params: anytype) usize {
199 var trash: [128]u8 = undefined;199 var trash: [128]u8 = undefined;
200 var bw: Writer = .{200 var w: Writer = .discarding(&trash);
201 .unbuffered_writer = .discarding,201 serializeTo(params, &w) catch unreachable;
202 .buffer = &trash,202 return w.count;
203 };
204 serializeTo(params, &bw) catch unreachable;
205 return bw.count;
206}203}
207204
208fn serializeTo(params: anytype, out: *Writer) !void {205fn serializeTo(params: anytype, out: *Writer) !void {
lib/std/crypto/sha2.zig+7-10
...@@ -383,22 +383,19 @@ fn Sha2x32(comptime iv: Iv32, digest_bits: comptime_int) type {...@@ -383,22 +383,19 @@ fn Sha2x32(comptime iv: Iv32, digest_bits: comptime_int) type {
383 for (&d.s, v) |*dv, vv| dv.* +%= vv;383 for (&d.s, v) |*dv, vv| dv.* +%= vv;
384 }384 }
385385
386 pub fn writable(this: *@This(), buffer: []u8) Writer {386 pub fn writer(this: *@This(), buffer: []u8) Writer {
387 return .{387 return .{
388 .unbuffered_writer = .{388 .context = this,
389 .context = this,389 .vtable = &.{ .drain = drain },
390 .vtable = &.{
391 .writeSplat = writeSplat,
392 .writeFile = Writer.unimplementedWriteFile,
393 },
394 },
395 .buffer = buffer,390 .buffer = buffer,
396 };391 };
397 }392 }
398393
399 fn writeSplat(context: ?*anyopaque, data: []const []const u8, splat: usize) Writer.Error!usize {394 fn drain(w: *Writer, data: []const []const u8, splat: usize) Writer.Error!usize {
400 const this: *@This() = @ptrCast(@alignCast(context));395 const this: *@This() = @ptrCast(@alignCast(w.context));
401 const start_total = this.total_len;396 const start_total = this.total_len;
397 this.update(w.buffered());
398 w.end = 0;
402 for (data[0 .. data.len - 1]) |slice| this.update(slice);399 for (data[0 .. data.len - 1]) |slice| this.update(slice);
403 for (0..splat) |_| this.update(data[data.len - 1]);400 for (0..splat) |_| this.update(data[data.len - 1]);
404 return @intCast(this.total_len - start_total);401 return @intCast(this.total_len - start_total);
lib/std/fmt.zig+3-6
...@@ -845,14 +845,11 @@ pub fn bufPrintZ(buf: []u8, comptime fmt: []const u8, args: anytype) BufPrintErr...@@ -845,14 +845,11 @@ pub fn bufPrintZ(buf: []u8, comptime fmt: []const u8, args: anytype) BufPrintErr
845/// Count the characters needed for format.845/// Count the characters needed for format.
846pub fn count(comptime fmt: []const u8, args: anytype) usize {846pub fn count(comptime fmt: []const u8, args: anytype) usize {
847 var trash_buffer: [64]u8 = undefined;847 var trash_buffer: [64]u8 = undefined;
848 var bw: Writer = .{848 var w: Writer = .discarding(&trash_buffer);
849 .unbuffered_writer = .discarding,849 w.print(fmt, args) catch |err| switch (err) {
850 .buffer = &trash_buffer,
851 };
852 bw.print(fmt, args) catch |err| switch (err) {
853 error.WriteFailed => unreachable,850 error.WriteFailed => unreachable,
854 };851 };
855 return bw.count;852 return w.count;
856}853}
857854
858pub fn allocPrint(gpa: Allocator, comptime fmt: []const u8, args: anytype) Allocator.Error![]u8 {855pub fn allocPrint(gpa: Allocator, comptime fmt: []const u8, args: anytype) Allocator.Error![]u8 {
lib/std/io/Writer.zig+17-54
...@@ -155,11 +155,7 @@ pub fn writeSplat(w: *Writer, data: []const []const u8, splat: usize) Error!usiz...@@ -155,11 +155,7 @@ pub fn writeSplat(w: *Writer, data: []const []const u8, splat: usize) Error!usiz
155 assert(data.len > 0);155 assert(data.len > 0);
156 const buffer = w.buffer;156 const buffer = w.buffer;
157 const count = countSplat(0, data, splat);157 const count = countSplat(0, data, splat);
158 if (w.end + count > buffer.len) {158 if (w.end + count > buffer.len) return w.vtable.drain(w, data, splat);
159 const end = w.end;
160 const n = try w.vtable.drain(w, data, splat);
161 return n -| end;
162 }
163 w.count += count;159 w.count += count;
164 for (data) |bytes| {160 for (data) |bytes| {
165 @memcpy(buffer[w.end..][0..bytes.len], bytes);161 @memcpy(buffer[w.end..][0..bytes.len], bytes);
...@@ -168,7 +164,6 @@ pub fn writeSplat(w: *Writer, data: []const []const u8, splat: usize) Error!usiz...@@ -168,7 +164,6 @@ pub fn writeSplat(w: *Writer, data: []const []const u8, splat: usize) Error!usiz
168 const pattern = data[data.len - 1];164 const pattern = data[data.len - 1];
169 if (splat == 0) {165 if (splat == 0) {
170 @branchHint(.unlikely);166 @branchHint(.unlikely);
171 // It was added in the loop above; undo it here.
172 w.end -= pattern.len;167 w.end -= pattern.len;
173 return count;168 return count;
174 }169 }
...@@ -245,24 +240,14 @@ pub fn writableSlice(w: *Writer, len: usize) Error![]u8 {...@@ -245,24 +240,14 @@ pub fn writableSlice(w: *Writer, len: usize) Error![]u8 {
245/// If `minimum_length` is zero, this is equivalent to `unusedCapacitySlice`.240/// If `minimum_length` is zero, this is equivalent to `unusedCapacitySlice`.
246pub fn writableSliceGreedy(w: *Writer, minimum_length: usize) Error![]u8 {241pub fn writableSliceGreedy(w: *Writer, minimum_length: usize) Error![]u8 {
247 assert(w.buffer.len >= minimum_length);242 assert(w.buffer.len >= minimum_length);
248 const cap_slice = w.buffer[w.end..];243 while (true) {
249 if (cap_slice.len >= minimum_length) {244 const cap_slice = w.buffer[w.end..];
250 @branchHint(.likely);245 if (cap_slice.len >= minimum_length) {
251 return cap_slice;246 @branchHint(.likely);
252 }247 return cap_slice;
253 const buffer = w.buffer[0..w.end];248 }
254 const n = try w.unbuffered_writer.writeVec(&.{buffer});249 assert(0 == try w.vtable.drain(w, &.{""}, 1));
255 if (n == buffer.len) {
256 @branchHint(.likely);
257 w.end = 0;
258 return w.buffer;
259 }
260 if (n > 0) {
261 const remainder = buffer[n..];
262 std.mem.copyForwards(u8, buffer[0..remainder.len], remainder);
263 w.end = remainder.len;
264 }250 }
265 return w.buffer[w.end..];
266}251}
267252
268pub fn ensureUnusedCapacity(w: *Writer, n: usize) Error!void {253pub fn ensureUnusedCapacity(w: *Writer, n: usize) Error!void {
...@@ -358,39 +343,17 @@ pub fn print(w: *Writer, comptime format: []const u8, args: anytype) Error!void...@@ -358,39 +343,17 @@ pub fn print(w: *Writer, comptime format: []const u8, args: anytype) Error!void
358}343}
359344
360pub fn writeByte(w: *Writer, byte: u8) Error!void {345pub fn writeByte(w: *Writer, byte: u8) Error!void {
361 const buffer = w.buffer[0..w.end];346 while (w.buffer.len - w.end == 0) {
362 if (buffer.len < w.buffer.len) {347 const n = try w.vtable.drain(w, &.{&.{byte}}, 1);
363 @branchHint(.likely);348 if (n > 0) {
364 buffer.ptr[buffer.len] = byte;349 w.count += 1;
365 w.end = buffer.len + 1;350 return;
366 w.count += 1;
367 return;
368 }
369 var buffers: [2][]const u8 = .{ buffer, &.{byte} };
370 while (true) {
371 const n = try w.unbuffered_writer.writeVec(&buffers);
372 if (n == 0) {
373 @branchHint(.unlikely);
374 continue;
375 }351 }
352 } else {
353 @branchHint(.likely);
354 w.buffer[w.end] = byte;
355 w.end += 1;
376 w.count += 1;356 w.count += 1;
377 if (n >= buffer.len) {
378 @branchHint(.likely);
379 if (n > buffer.len) {
380 @branchHint(.likely);
381 w.end = 0;
382 return;
383 } else {
384 buffer[0] = byte;
385 w.end = 1;
386 return;
387 }
388 }
389 const remainder = buffer[n..];
390 std.mem.copyForwards(u8, buffer[0..remainder.len], remainder);
391 buffer[remainder.len] = byte;
392 w.end = remainder.len + 1;
393 return;
394 }357 }
395}358}
396359
lib/std/zon/stringify.zig+2-5
...@@ -1040,11 +1040,8 @@ pub const Serializer = struct {...@@ -1040,11 +1040,8 @@ pub const Serializer = struct {
1040};1040};
10411041
1042test Serializer {1042test Serializer {
1043 var bw: Writer = .{1043 var w: Writer = .discarding(&.{});
1044 .unbuffered_writer = .discarding,1044 var s: Serializer = .{ .writer = &w };
1045 .buffer = &.{},
1046 };
1047 var s: Serializer = .{ .writer = &bw };
1048 var vec2 = try s.beginStruct(.{});1045 var vec2 = try s.beginStruct(.{});
1049 try vec2.field("x", 1.5, .{});1046 try vec2.field("x", 1.5, .{});
1050 try vec2.fieldPrefix("prefix");1047 try vec2.fieldPrefix("prefix");