diff --git a/dune-project b/dune-project index bfc5fa3c..a21c2343 100644 --- a/dune-project +++ b/dune-project @@ -31,6 +31,7 @@ (and (>= "1.17") (< "1.18"))) + atomic ("jsonrpc" (and (>= "1.17") diff --git a/linol.opam b/linol.opam index cf1e237b..cc404cce 100644 --- a/linol.opam +++ b/linol.opam @@ -13,6 +13,7 @@ depends: [ "logs" "trace" {>= "0.4"} "lsp" {>= "1.17" & < "1.18"} + "atomic" "jsonrpc" {>= "1.17" & < "1.18"} "ocaml" {>= "4.14"} "odoc" {with-doc} diff --git a/src/dune b/src/dune index 965dc0be..b4872003 100644 --- a/src/dune +++ b/src/dune @@ -3,4 +3,4 @@ (public_name linol) (private_modules log) (flags :standard -warn-error -a+8) - (libraries yojson lsp logs threads trace.core)) + (libraries yojson lsp logs threads trace.core atomic)) diff --git a/src/jsonrpc2.ml b/src/jsonrpc2.ml index 75237afd..a341bb23 100644 --- a/src/jsonrpc2.ml +++ b/src/jsonrpc2.ml @@ -69,7 +69,7 @@ module Make (IO : IO) : S with module IO = IO = struct on_sent: json -> unit; on_received: json -> unit; s: server; - mutable id_counter: int; + id_counter: int Atomic.t; pending_responses: (Req_id.t, server_request_handler_pair) Hashtbl.t; } @@ -78,7 +78,7 @@ module Make (IO : IO) : S with module IO = IO = struct ic; oc; s = server; - id_counter = 0; + id_counter = Atomic.make 0; on_sent; on_received; pending_responses = Hashtbl.create 8; @@ -116,8 +116,7 @@ module Make (IO : IO) : S with module IO = IO = struct (** Returns a new, unused [Req_id.t] to send a server request. *) let fresh_lsp_id (self : t) : Req_id.t = - let id = self.id_counter in - self.id_counter <- id + 1; + let id = Atomic.fetch_and_add self.id_counter 1 in `Int id (** Registers a new handler for a request response. The return indicates