fix: send sigterm to languages servers on exit

Not all language servers willingly exit if we just close stdin. Eventually
we will follow the protocol's shutdown process, but for now we just send a
sigterm.
This commit is contained in:
CJ van den Berg 2024-04-15 21:15:26 +02:00
parent 55e99fe958
commit 9eb6dd3be4
3 changed files with 19 additions and 3 deletions

View file

@ -20,8 +20,8 @@
.hash = "1220a7cf5f59b61257993bc5b02991ffc523d103f66842fa8d8ab5c9fdba52799340", .hash = "1220a7cf5f59b61257993bc5b02991ffc523d103f66842fa8d8ab5c9fdba52799340",
}, },
.thespian = .{ .thespian = .{
.url = "https://github.com/neurocyte/thespian/archive/7d441d3bcfaee66b313a333d440deac2e26f8c2a.tar.gz", .url = "https://github.com/neurocyte/thespian/archive/9be51bb18aae4ff43ffcac649d540a7b4441e4b8.tar.gz",
.hash = "12206c348bbfb59dcbef2dd3ee5728ad9e26ae925d664eb82cd47b40d91fe6c7a063", .hash = "1220b78192e49c81dde3d0810985e54be703a192fc5185d2da56929baea0b5186e74",
}, },
.themes = .{ .themes = .{
.url = "https://github.com/neurocyte/flow-themes/releases/download/master-69be8cd05fddcbc2a3ca2dec4abe6b8d07ed65b1/flow-themes.tar.gz", .url = "https://github.com/neurocyte/flow-themes/releases/download/master-69be8cd05fddcbc2a3ca2dec4abe6b8d07ed65b1/flow-themes.tar.gz",

View file

@ -22,6 +22,11 @@ pub fn deinit(self: *Self) void {
self.pid.deinit(); self.pid.deinit();
} }
pub fn term(self: *Self) void {
self.pid.send(.{"term"}) catch {};
self.pid.deinit();
}
pub fn send_request(self: Self, a: std.mem.Allocator, method: []const u8, m: anytype) error{Exit}!tp.message { pub fn send_request(self: Self, a: std.mem.Allocator, method: []const u8, m: anytype) error{Exit}!tp.message {
// const frame = tracy.initZone(@src(), .{ .name = module_name ++ ".send_request" }); // const frame = tracy.initZone(@src(), .{ .name = module_name ++ ".send_request" });
// defer frame.deinit(); // defer frame.deinit();
@ -107,6 +112,14 @@ const Process = struct {
} }
} }
fn term(self: *Process) tp.result {
if (self.sp) |*sp| {
defer self.sp = null;
try sp.term();
self.write_log("### terminated ###\n", .{});
}
}
fn start(self: *Process) tp.result { fn start(self: *Process) tp.result {
const frame = tracy.initZone(@src(), .{ .name = module_name ++ " start" }); const frame = tracy.initZone(@src(), .{ .name = module_name ++ " start" });
defer frame.deinit(); defer frame.deinit();
@ -137,6 +150,9 @@ const Process = struct {
} else if (try m.match(.{"close"})) { } else if (try m.match(.{"close"})) {
self.write_log("### LSP close ###\n", .{}); self.write_log("### LSP close ###\n", .{});
try self.close(); try self.close();
} else if (try m.match(.{"term"})) {
self.write_log("### LSP terminated ###\n", .{});
try self.term();
} else if (try m.match(.{ self.sp_tag, "stdout", tp.extract(&bytes) })) { } else if (try m.match(.{ self.sp_tag, "stdout", tp.extract(&bytes) })) {
self.handle_output(bytes) catch |e| return tp.exit_error(e); self.handle_output(bytes) catch |e| return tp.exit_error(e);
} else if (try m.match(.{ self.sp_tag, "term", tp.extract(&err), tp.extract(&code) })) { } else if (try m.match(.{ self.sp_tag, "term", tp.extract(&err), tp.extract(&code) })) {

View file

@ -45,7 +45,7 @@ pub fn deinit(self: *Self) void {
var i = self.language_servers.iterator(); var i = self.language_servers.iterator();
while (i.next()) |p| { while (i.next()) |p| {
self.a.free(p.key_ptr.*); self.a.free(p.key_ptr.*);
p.value_ptr.*.deinit(); p.value_ptr.*.term();
} }
for (self.files.items) |file| self.a.free(file.path); for (self.files.items) |file| self.a.free(file.path);
self.files.deinit(); self.files.deinit();