@@ -3573,7 +3573,21 @@ fn serve(
3573
3573
if (comp .bin_file .options .output_mode == .Exe ) {
3574
3574
try comp .makeBinFileWritable ();
3575
3575
}
3576
- try comp .update (main_progress_node );
3576
+
3577
+ {
3578
+ var reset : std.Thread.ResetEvent = .{};
3579
+
3580
+ var progress_thread = try std .Thread .spawn (.{}, progressThread , .{
3581
+ & progress , out , & reset ,
3582
+ });
3583
+ defer {
3584
+ reset .set ();
3585
+ progress_thread .join ();
3586
+ }
3587
+
3588
+ try comp .update (main_progress_node );
3589
+ }
3590
+
3577
3591
try comp .makeBinFileExecutable ();
3578
3592
try serveUpdateResults (out , comp );
3579
3593
},
@@ -3629,6 +3643,63 @@ fn serve(
3629
3643
}
3630
3644
}
3631
3645
3646
+ fn progressThread (progress : * std.Progress , out : fs.File , reset : * std.Thread.ResetEvent ) void {
3647
+ while (true ) {
3648
+ if (reset .timedWait (500 * std .time .ns_per_ms )) | _ | {
3649
+ // The Compilation update has completed.
3650
+ return ;
3651
+ } else | err | switch (err ) {
3652
+ error .Timeout = > {},
3653
+ }
3654
+
3655
+ var buf : std .BoundedArray (u8 , 160 ) = .{};
3656
+
3657
+ {
3658
+ progress .update_mutex .lock ();
3659
+ defer progress .update_mutex .unlock ();
3660
+
3661
+ var need_ellipse = false ;
3662
+ var maybe_node : ? * std.Progress.Node = & progress .root ;
3663
+ while (maybe_node ) | node | {
3664
+ if (need_ellipse ) {
3665
+ buf .appendSlice ("... " ) catch {};
3666
+ }
3667
+ need_ellipse = false ;
3668
+ const eti = @atomicLoad (usize , & node .unprotected_estimated_total_items , .Monotonic );
3669
+ const completed_items = @atomicLoad (usize , & node .unprotected_completed_items , .Monotonic );
3670
+ const current_item = completed_items + 1 ;
3671
+ if (node .name .len != 0 or eti > 0 ) {
3672
+ if (node .name .len != 0 ) {
3673
+ buf .appendSlice (node .name ) catch {};
3674
+ need_ellipse = true ;
3675
+ }
3676
+ if (eti > 0 ) {
3677
+ if (need_ellipse ) buf .appendSlice (" " ) catch {};
3678
+ buf .writer ().print ("[{d}/{d}] " , .{ current_item , eti }) catch {};
3679
+ need_ellipse = false ;
3680
+ } else if (completed_items != 0 ) {
3681
+ if (need_ellipse ) buf .appendSlice (" " ) catch {};
3682
+ buf .writer ().print ("[{d}] " , .{current_item }) catch {};
3683
+ need_ellipse = false ;
3684
+ }
3685
+ }
3686
+ maybe_node = @atomicLoad (? * std .Progress .Node , & node .recently_updated_child , .Acquire );
3687
+ }
3688
+ }
3689
+
3690
+ const progress_string = buf .slice ();
3691
+
3692
+ serveMessage (out , .{
3693
+ .tag = .progress ,
3694
+ .bytes_len = @intCast (u32 , progress_string .len ),
3695
+ }, &.{
3696
+ progress_string ,
3697
+ }) catch | err | {
3698
+ fatal ("unable to write to client: {s}" , .{@errorName (err )});
3699
+ };
3700
+ }
3701
+ }
3702
+
3632
3703
fn serveMessage (
3633
3704
out : fs.File ,
3634
3705
header : std.zig.Server.Message.Header ,
0 commit comments