@@ -56,8 +56,7 @@ offset_encoding: offsets.Encoding = .@"utf-16",
5656status : Status = .uninitialized ,
5757
5858// private fields
59- thread_pool : if (zig_builtin .single_threaded ) void else std.Thread.Pool ,
60- wait_group : if (zig_builtin .single_threaded ) void else std.Thread.WaitGroup ,
59+ thread_pool : std.Thread.Pool ,
6160job_queue : std .fifo .LinearFifo (Job , .Dynamic ),
6261job_queue_lock : std.Thread.Mutex = .{},
6362ip : InternPool = undefined ,
@@ -2116,43 +2115,35 @@ fn isBlockingMessage(msg: Message) bool {
21162115/// make sure to also set the `transport` field
21172116pub fn create (allocator : std.mem.Allocator ) ! * Server {
21182117 const server = try allocator .create (Server );
2119- errdefer server .destroy ();
2118+ errdefer allocator .destroy (server );
21202119 server .* = .{
21212120 .allocator = allocator ,
21222121 .config = .{},
21232122 .document_store = .{
21242123 .allocator = allocator ,
21252124 .config = .init ,
2126- .thread_pool = if ( zig_builtin . single_threaded ) {} else undefined , // set below
2125+ .thread_pool = & server . thread_pool ,
21272126 .diagnostics_collection = & server .diagnostics_collection ,
21282127 },
21292128 .job_queue = .init (allocator ),
21302129 .thread_pool = undefined , // set below
2131- .wait_group = if (zig_builtin .single_threaded ) {} else .{},
21322130 .diagnostics_collection = .{ .allocator = allocator },
21332131 };
21342132
2135- if (zig_builtin .single_threaded ) {
2136- server .thread_pool = {};
2137- } else {
2138- try server .thread_pool .init (.{
2139- .allocator = allocator ,
2140- .n_jobs = @min (4 , std .Thread .getCpuCount () catch 1 ), // what is a good value here?
2141- });
2142- server .document_store .thread_pool = & server .thread_pool ;
2143- }
2133+ try server .thread_pool .init (.{
2134+ .allocator = allocator ,
2135+ .n_jobs = @min (4 , std .Thread .getCpuCount () catch 1 ), // what is a good value here?
2136+ });
2137+ errdefer server .thread_pool .deinit ();
21442138
21452139 server .ip = try InternPool .init (allocator );
2140+ errdefer server .ip .deinit (allocator );
21462141
21472142 return server ;
21482143}
21492144
21502145pub fn destroy (server : * Server ) void {
2151- if (! zig_builtin .single_threaded ) {
2152- server .wait_group .wait ();
2153- server .thread_pool .deinit ();
2154- }
2155-
2146+ server .thread_pool .deinit ();
21562147 while (server .job_queue .readItem ()) | job | job .deinit (server .allocator );
21572148 server .job_queue .deinit ();
21582149 server .document_store .deinit ();
@@ -2179,34 +2170,27 @@ pub fn keepRunning(server: Server) bool {
21792170 }
21802171}
21812172
2182- pub fn waitAndWork (server : * Server ) void {
2183- if (zig_builtin .single_threaded ) return ;
2184- server .thread_pool .waitAndWork (& server .wait_group );
2185- server .wait_group .reset ();
2186- }
2187-
21882173/// The main loop of ZLS
21892174pub fn loop (server : * Server ) ! void {
21902175 std .debug .assert (server .transport != null );
2176+ var wait_group : std.Thread.WaitGroup = .{};
21912177 while (server .keepRunning ()) {
21922178 const json_message = try server .transport .? .readJsonMessage (server .allocator );
21932179 defer server .allocator .free (json_message );
21942180
21952181 try server .sendJsonMessage (json_message );
21962182
21972183 while (server .job_queue .readItem ()) | job | {
2198- if (zig_builtin .single_threaded ) {
2199- server .processJob (job );
2200- continue ;
2201- }
2202-
22032184 switch (job .syncMode ()) {
22042185 .exclusive = > {
2205- server .waitAndWork ();
2186+ if (! zig_builtin .single_threaded ) {
2187+ server .thread_pool .waitAndWork (& wait_group );
2188+ wait_group .reset ();
2189+ }
22062190 server .processJob (job );
22072191 },
22082192 .shared = > {
2209- server .thread_pool .spawnWg (& server . wait_group , processJob , .{ server , job });
2193+ server .thread_pool .spawnWg (& wait_group , processJob , .{ server , job });
22102194 },
22112195 }
22122196 }
0 commit comments