Skip to content

Commit 4633bf4

Browse files
committed
use std.Thread.Pool even when building with -Dsingle-threaded
1 parent a983928 commit 4633bf4

File tree

2 files changed

+22
-49
lines changed

2 files changed

+22
-49
lines changed

src/DocumentStore.zig

Lines changed: 6 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ allocator: std.mem.Allocator,
2222
/// the DocumentStore assumes that `config` is not modified while calling one of its functions.
2323
config: Config,
2424
lock: std.Thread.RwLock = .{},
25-
thread_pool: if (builtin.single_threaded) void else *std.Thread.Pool,
25+
thread_pool: *std.Thread.Pool,
2626
handles: std.StringArrayHashMapUnmanaged(*Handle) = .empty,
2727
build_files: if (supports_build_system) std.StringArrayHashMapUnmanaged(*BuildFile) else void = if (supports_build_system) .empty else {},
2828
cimports: if (supports_build_system) std.AutoArrayHashMapUnmanaged(Hash, translate_c.Result) else void = if (supports_build_system) .empty else {},
@@ -80,7 +80,7 @@ pub const BuildFile = struct {
8080
build_associated_config: ?std.json.Parsed(BuildAssociatedConfig) = null,
8181
impl: struct {
8282
mutex: std.Thread.Mutex = .{},
83-
build_runner_state: if (builtin.single_threaded) void else BuildRunnerState = if (builtin.single_threaded) {} else .idle,
83+
build_runner_state: BuildRunnerState = .idle,
8484
version: u32 = 0,
8585
/// contains information extracted from running build.zig with a custom build runner
8686
/// e.g. include paths & packages
@@ -835,11 +835,6 @@ pub fn invalidateBuildFile(self: *DocumentStore, build_file_uri: Uri) void {
835835

836836
const build_file = self.getBuildFile(build_file_uri) orelse return;
837837

838-
if (builtin.single_threaded) {
839-
self.invalidateBuildFileWorker(build_file);
840-
return;
841-
}
842-
843838
self.thread_pool.spawn(invalidateBuildFileWorker, .{ self, build_file }) catch {
844839
self.invalidateBuildFileWorker(build_file);
845840
return;
@@ -1474,17 +1469,11 @@ pub fn loadDirectoryRecursive(store: *DocumentStore, directory_uri: Uri) !usize
14741469
}
14751470
};
14761471

1477-
if (builtin.single_threaded) {
1478-
while (not_currently_loading_uris.pop()) |uri| {
1479-
S.getOrLoadHandleVoid(store, uri);
1480-
}
1481-
} else {
1482-
var wait_group: std.Thread.WaitGroup = .{};
1483-
while (not_currently_loading_uris.pop()) |uri| {
1484-
store.thread_pool.spawnWg(&wait_group, S.getOrLoadHandleVoid, .{ store, uri });
1485-
}
1486-
store.thread_pool.waitAndWork(&wait_group);
1472+
var wait_group: std.Thread.WaitGroup = .{};
1473+
while (not_currently_loading_uris.pop()) |uri| {
1474+
store.thread_pool.spawnWg(&wait_group, S.getOrLoadHandleVoid, .{ store, uri });
14871475
}
1476+
store.thread_pool.waitAndWork(&wait_group);
14881477

14891478
return file_count;
14901479
}

src/Server.zig

Lines changed: 16 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -56,8 +56,7 @@ offset_encoding: offsets.Encoding = .@"utf-16",
5656
status: 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,
6160
job_queue: std.fifo.LinearFifo(Job, .Dynamic),
6261
job_queue_lock: std.Thread.Mutex = .{},
6362
ip: InternPool = undefined,
@@ -2125,43 +2124,35 @@ fn isBlockingMessage(msg: Message) bool {
21252124
/// make sure to also set the `transport` field
21262125
pub 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

21592154
pub 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
21982183
pub 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

Comments
 (0)