@@ -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 ,
@@ -2125,43 +2124,35 @@ fn isBlockingMessage(msg: Message) bool {
21252124/// make sure to also set the `transport` field
21262125pub fn create (allocator : std.mem.Allocator ) ! * Server {
21272126 const server = try allocator .create (Server );
2128- errdefer server .destroy ();
2127+ errdefer allocator .destroy (server );
21292128 server .* = .{
21302129 .allocator = allocator ,
21312130 .config = .{},
21322131 .document_store = .{
21332132 .allocator = allocator ,
21342133 .config = .init ,
2135- .thread_pool = if ( zig_builtin . single_threaded ) {} else undefined , // set below
2134+ .thread_pool = & server . thread_pool ,
21362135 .diagnostics_collection = & server .diagnostics_collection ,
21372136 },
21382137 .job_queue = .init (allocator ),
21392138 .thread_pool = undefined , // set below
2140- .wait_group = if (zig_builtin .single_threaded ) {} else .{},
21412139 .diagnostics_collection = .{ .allocator = allocator },
21422140 };
21432141
2144- if (zig_builtin .single_threaded ) {
2145- server .thread_pool = {};
2146- } else {
2147- try server .thread_pool .init (.{
2148- .allocator = allocator ,
2149- .n_jobs = @min (4 , std .Thread .getCpuCount () catch 1 ), // what is a good value here?
2150- });
2151- server .document_store .thread_pool = & server .thread_pool ;
2152- }
2142+ try server .thread_pool .init (.{
2143+ .allocator = allocator ,
2144+ .n_jobs = @min (4 , std .Thread .getCpuCount () catch 1 ), // what is a good value here?
2145+ });
2146+ errdefer server .thread_pool .deinit ();
21532147
21542148 server .ip = try InternPool .init (allocator );
2149+ errdefer server .ip .deinit (allocator );
21552150
21562151 return server ;
21572152}
21582153
21592154pub fn destroy (server : * Server ) void {
2160- if (! zig_builtin .single_threaded ) {
2161- server .wait_group .wait ();
2162- server .thread_pool .deinit ();
2163- }
2164-
2155+ server .thread_pool .deinit ();
21652156 while (server .job_queue .readItem ()) | job | job .deinit (server .allocator );
21662157 server .job_queue .deinit ();
21672158 server .document_store .deinit ();
@@ -2188,34 +2179,27 @@ pub fn keepRunning(server: Server) bool {
21882179 }
21892180}
21902181
2191- pub fn waitAndWork (server : * Server ) void {
2192- if (zig_builtin .single_threaded ) return ;
2193- server .thread_pool .waitAndWork (& server .wait_group );
2194- server .wait_group .reset ();
2195- }
2196-
21972182/// The main loop of ZLS
21982183pub fn loop (server : * Server ) ! void {
21992184 std .debug .assert (server .transport != null );
2185+ var wait_group : std.Thread.WaitGroup = .{};
22002186 while (server .keepRunning ()) {
22012187 const json_message = try server .transport .? .readJsonMessage (server .allocator );
22022188 defer server .allocator .free (json_message );
22032189
22042190 try server .sendJsonMessage (json_message );
22052191
22062192 while (server .job_queue .readItem ()) | job | {
2207- if (zig_builtin .single_threaded ) {
2208- server .processJob (job );
2209- continue ;
2210- }
2211-
22122193 switch (job .syncMode ()) {
22132194 .exclusive = > {
2214- server .waitAndWork ();
2195+ if (! zig_builtin .single_threaded ) {
2196+ server .thread_pool .waitAndWork (& wait_group );
2197+ wait_group .reset ();
2198+ }
22152199 server .processJob (job );
22162200 },
22172201 .shared = > {
2218- server .thread_pool .spawnWg (& server . wait_group , processJob , .{ server , job });
2202+ server .thread_pool .spawnWg (& wait_group , processJob , .{ server , job });
22192203 },
22202204 }
22212205 }
0 commit comments