Merge pull request #60 from kuviman/fix-eio-spawn
Some checks failed
github pages / deploy (push) Has been cancelled
build / build4 (4.14.x, ubuntu-latest) (push) Has been cancelled
build / build5 (5.1.x, ubuntu-latest) (push) Has been cancelled
build / build5 (5.2.x, ubuntu-latest) (push) Has been cancelled
build / build5 (5.3.x, ubuntu-latest) (push) Has been cancelled

Make template-eio handle requests concurrently
This commit is contained in:
Simon Cruanes 2025-12-01 17:16:14 -05:00 committed by GitHub
commit c6e84391e7
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 9 additions and 11 deletions

View file

@ -37,7 +37,7 @@ let diagnostics (_state : state_after_processing) : Lsp.Types.Diagnostic.t list
so that users only need to override methods that they want the server to so that users only need to override methods that they want the server to
actually meaningfully interpret and respond to. actually meaningfully interpret and respond to.
*) *)
class lsp_server = class lsp_server ~(sw: Eio.Switch.t) =
object (self) object (self)
inherit Linol_eio.Jsonrpc2.server inherit Linol_eio.Jsonrpc2.server
@ -45,7 +45,7 @@ class lsp_server =
val buffers : (Lsp.Types.DocumentUri.t, state_after_processing) Hashtbl.t = val buffers : (Lsp.Types.DocumentUri.t, state_after_processing) Hashtbl.t =
Hashtbl.create 32 Hashtbl.create 32
method spawn_query_handler f = Linol_eio.spawn f method spawn_query_handler f = Linol_eio.spawn ~sw f
(* We define here a helper method that will: (* We define here a helper method that will:
- process a document - process a document
@ -82,7 +82,8 @@ class lsp_server =
and runs it as a task. *) and runs it as a task. *)
let run () = let run () =
Eio_main.run @@ fun env -> Eio_main.run @@ fun env ->
let s = new lsp_server in Eio.Switch.run @@ fun sw ->
let s = new lsp_server ~sw in
let server = Linol_eio.Jsonrpc2.create_stdio ~env s in let server = Linol_eio.Jsonrpc2.create_stdio ~env s in
let task () = let task () =
let shutdown () = s#get_status = `ReceivedExit in let shutdown () = s#get_status = `ReceivedExit in

View file

@ -52,17 +52,14 @@ module IO_eio :
end end
(** Spawn function. *) (** Spawn function. *)
let spawn f = let spawn ~sw f =
let promise, resolver = Eio.Promise.create () in Eio.Fiber.fork ~sw (fun () ->
(try try
f (); f ()
Eio.Promise.resolve_ok resolver ()
with exn -> with exn ->
Printf.eprintf "uncaught exception in `spawn`:\n%s\n%!" Printf.eprintf "uncaught exception in `spawn`:\n%s\n%!"
(Printexc.to_string exn); (Printexc.to_string exn);
Eio.Promise.resolve_error resolver exn); raise exn)
Eio.Promise.await_exn promise
include Lsp.Types include Lsp.Types
include IO_eio include IO_eio