Skip to content

Commit 595c194

Browse files
garesmaximedenes
authored andcommitted
depend on sel 0.4.0
1 parent e2d7595 commit 595c194

25 files changed

+155
-1123
lines changed

flake.nix

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@
5757
sexplib
5858
ppx_yojson_conv
5959
lsp
60+
sel
6061
]);
6162
};
6263

language-server/dm/delegationManager.ml

Lines changed: 11 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ module type Worker = sig
8080
(** Event for the main loop *)
8181
type delegation
8282
val pr_event : delegation -> Pp.t
83-
type events = delegation Sel.event list
83+
type events = delegation Sel.Event.t list
8484

8585
(** handling an event may require an update to a sentence in the exec state,
8686
e.g. when a feedback is received *)
@@ -91,10 +91,10 @@ module type Worker = sig
9191
- if we can fork, job is passed to fork_action
9292
- otherwise Job.binary_name is spawn and the job sent to it *)
9393
val worker_available :
94-
jobs:((job_handle * Sel.cancellation_handle * job_t) Queue.t) ->
94+
jobs:((job_handle * Sel.Event.cancellation_handle * job_t) Queue.t) ->
9595
fork_action:(job_t -> send_back:(job_update_request -> unit) -> unit) ->
9696
feedback_cleanup:(unit -> unit) ->
97-
delegation Sel.event * Sel.cancellation_handle
97+
delegation Sel.Event.t
9898

9999
(* for worker toplevels *)
100100
type options
@@ -139,7 +139,7 @@ let install_debug_worker link =
139139
Log.worker_initialization_done
140140
~fwd_event:(fun e -> write_value link (DebugMessage e))
141141

142-
type events = delegation Sel.event list
142+
type events = delegation Sel.Event.t list
143143

144144
type role = Master | Worker of link
145145

@@ -161,21 +161,19 @@ let resize_pool new_pool_size =
161161
;;
162162

163163
(* In order to create a job we enqueue this event *)
164-
let worker_available ~jobs ~fork_action ~feedback_cleanup : delegation Sel.event * Sel.cancellation_handle =
165-
Sel.on_queues jobs pool (fun (job_handle, _, job) () ->
164+
let worker_available ~jobs ~fork_action ~feedback_cleanup : delegation Sel.Event.t =
165+
Sel.On.queues jobs pool (fun (job_handle, _, job) () ->
166166
WorkerStart (feedback_cleanup,job_handle,job,fork_action,Job.binary_name))
167167

168168
(* When a worker is spawn, we enqueue this event, since eventually it will die *)
169-
let worker_ends pid : delegation Sel.event =
170-
Sel.on_death_of ~pid (fun reason -> WorkerEnd(pid,reason))
171-
|> Sel.uncancellable
169+
let worker_ends pid : delegation Sel.Event.t =
170+
Sel.On.death_of ~pid (fun reason -> WorkerEnd(pid,reason))
172171

173172
(* When a worker is spawn, we enqueue this event, since eventually will make progress *)
174-
let worker_progress link : delegation Sel.event =
175-
Sel.on_ocaml_value link.read_from (function
173+
let worker_progress link : delegation Sel.Event.t =
174+
Sel.On.ocaml_value link.read_from (function
176175
| Error e -> WorkerIOError e
177176
| Ok update_request -> WorkerProgress { link; update_request; })
178-
|> Sel.uncancellable
179177

180178
(* ************ spawning *************************************************** *)
181179

@@ -326,7 +324,7 @@ let setup_plumbing port =
326324
let write_to = chan in
327325
let link = { read_from; write_to } in
328326
(* Unix.read_value does not exist, we use Sel *)
329-
match Sel.(pop (enqueue empty [Sel.on_ocaml_value read_from (fun x -> x) |> Sel.uncancellable])) with
327+
match Sel.(pop Todo.(add empty [Sel.On.ocaml_value read_from (fun x -> x)])) with
330328
| Ok (job : Job.t), _ -> (write_value link, job)
331329
| Error exn, _ ->
332330
log_worker @@ "error receiving job: " ^ Printexc.to_string exn;

language-server/dm/delegationManager.mli

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ module type Worker = sig
6161
(** Event for the main loop *)
6262
type delegation
6363
val pr_event : delegation -> Pp.t
64-
type events = delegation Sel.event list
64+
type events = delegation Sel.Event.t list
6565

6666
(** handling an event may require an update to a sentence in the exec state,
6767
e.g. when a feedback is received *)
@@ -72,10 +72,10 @@ module type Worker = sig
7272
- if we can fork, job is passed to fork_action
7373
- otherwise Job.binary_name is spawn and the job sent to it *)
7474
val worker_available :
75-
jobs:((job_handle * Sel.cancellation_handle * job_t) Queue.t) ->
75+
jobs:((job_handle * Sel.Event.cancellation_handle * job_t) Queue.t) ->
7676
fork_action:(job_t -> send_back:(job_update_request -> unit) -> unit) ->
7777
feedback_cleanup:(unit -> unit) ->
78-
delegation Sel.event * Sel.cancellation_handle
78+
delegation Sel.Event.t
7979

8080
(* for worker toplevels *)
8181
type options

language-server/dm/documentManager.ml

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -45,10 +45,10 @@ let pp_event fmt = function
4545
Stdlib.Format.fprintf fmt "ExecuteToLoc %d (%d tasks left, started %2.3f ago)" (Stateid.to_int id) (List.length todo) time
4646
| ExecutionManagerEvent _ -> Stdlib.Format.fprintf fmt "ExecutionManagerEvent"
4747

48-
let inject_em_event x = Sel.map (fun e -> ExecutionManagerEvent e) x
48+
let inject_em_event x = Sel.Event.map (fun e -> ExecutionManagerEvent e) x
4949
let inject_em_events events = List.map inject_em_event events
5050

51-
type events = event Sel.event list
51+
type events = event Sel.Event.t list
5252

5353
type exec_overview = {
5454
parsed : Range.t list;
@@ -172,7 +172,7 @@ let reset { uri; opts; init_vs; document; execution_state } =
172172
let execution_state, feedback = ExecutionManager.init init_vs in
173173
{ uri; opts; init_vs; document; execution_state; observe_id = None }, [inject_em_event feedback]
174174

175-
let interpret_to ~stateful ~background state id : (state * event Sel.event list) =
175+
let interpret_to ~stateful ~background state id : (state * event Sel.Event.t list) =
176176
match Document.get_sentence state.document id with
177177
| None -> (state, []) (* TODO error? *)
178178
| Some { id } ->
@@ -181,8 +181,8 @@ let interpret_to ~stateful ~background state id : (state * event Sel.event list)
181181
if CList.is_empty todo then
182182
(state, [])
183183
else
184-
let event = Sel.now (Execute {id; vst_for_next_todo; todo; started = Unix.gettimeofday (); background }) in
185-
let event = if background then event else Sel.set_priority PriorityManager.execution event in
184+
let priority = if background then None else Some PriorityManager.execution in
185+
let event = Sel.now ?priority (Execute {id; vst_for_next_todo; todo; started = Unix.gettimeofday (); background }) in
186186
(state, [ event ])
187187

188188
let interpret_to_position ~stateful st pos =
@@ -276,8 +276,8 @@ let handle_event ev st =
276276
ExecutionManager.execute st.execution_state (vst_for_next_todo, [], false) task in
277277
(* We do not update the state here because we may have received feedback while
278278
executing *)
279-
let event = Sel.now (Execute {id; vst_for_next_todo; todo; started; background }) in
280-
let event = if background then event else Sel.set_priority PriorityManager.execution @@ event in
279+
let priority = if background then None else Some PriorityManager.execution in
280+
let event = Sel.now ?priority (Execute {id; vst_for_next_todo; todo; started; background }) in
281281
(Some {st with execution_state}, inject_em_events events @ [event])
282282
| ExecutionManagerEvent ev ->
283283
let execution_state_update, events = ExecutionManager.handle_event ev st.execution_state in

language-server/dm/documentManager.mli

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ type state
2828
type event
2929
val pp_event : Format.formatter -> event -> unit
3030

31-
type events = event Sel.event list
31+
type events = event Sel.Event.t list
3232

3333
val init : Vernacstate.t -> opts:Coqargs.injection_command list -> DocumentUri.t -> text:string -> state * events
3434
(** [init st opts uri text] initializes the document manager with initial vernac state
@@ -92,7 +92,7 @@ val get_completions : state -> Position.t -> (completion_item list, string) Resu
9292
val handle_event : event -> state -> (state option * events)
9393
(** handles events and returns a new state if it was updated *)
9494

95-
val search : state -> id:string -> Position.t -> string -> notification Sel.event list
95+
val search : state -> id:string -> Position.t -> string -> notification Sel.Event.t list
9696

9797
val about : state -> Position.t -> pattern:string -> (string,string) Result.t
9898

language-server/dm/executionManager.ml

Lines changed: 16 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ type state = {
7373
doc_id : document_id; (* unique number used to interface with Coq's Feedback *)
7474
coq_feeder : coq_feedback_listener;
7575
sel_feedback_queue : (Feedback.route_id * sentence_id * (Feedback.level * Loc.t option * Pp.t)) Queue.t;
76-
sel_cancellation_handle : Sel.cancellation_handle;
76+
sel_cancellation_handle : Sel.Event.cancellation_handle;
7777
}
7878

7979
let options = ref default_options
@@ -116,14 +116,14 @@ end
116116
module ProofWorker = DelegationManager.MakeWorker(ProofJob)
117117

118118
type event =
119-
| LocalFeedback of Feedback.route_id * sentence_id * (Feedback.level * Loc.t option * Pp.t)
119+
| LocalFeedback of (Feedback.route_id * sentence_id * (Feedback.level * Loc.t option * Pp.t)) Queue.t * Feedback.route_id * sentence_id * (Feedback.level * Loc.t option * Pp.t)
120120
| ProofWorkerEvent of ProofWorker.delegation
121-
type events = event Sel.event list
121+
type events = event Sel.Event.t list
122122
let pr_event = function
123123
| LocalFeedback _ -> Pp.str "LocalFeedback"
124124
| ProofWorkerEvent event -> ProofWorker.pr_event event
125125

126-
let inject_proof_event = Sel.map (fun x -> ProofWorkerEvent x)
126+
let inject_proof_event = Sel.Event.map (fun x -> ProofWorkerEvent x)
127127
let inject_proof_events st l =
128128
(st, List.map inject_proof_event l)
129129

@@ -221,12 +221,8 @@ let update state id v =
221221
update_all id (Done v) fl state
222222
;;
223223

224-
let local_feedback feedback_queue : event Sel.event * Sel.cancellation_handle =
225-
let e, c = Sel.on_queue feedback_queue (fun (rid,sid,msg) -> LocalFeedback(rid,sid,msg)) in
226-
e |> Sel.name "feedback"
227-
|> Sel.make_recurring
228-
|> Sel.set_priority PriorityManager.feedback,
229-
c
224+
let local_feedback feedback_queue : event Sel.Event.t =
225+
Sel.On.queue ~name:"feedback" ~priority:PriorityManager.feedback feedback_queue (fun (rid,sid,msg) -> LocalFeedback(feedback_queue,rid,sid,msg))
230226

231227
let install_feedback_listener doc_id send =
232228
let open Feedback in
@@ -239,7 +235,8 @@ let init vernac_state =
239235
let doc_id = fresh_doc_id () in
240236
let sel_feedback_queue = Queue.create () in
241237
let coq_feeder = install_feedback_listener doc_id (fun x -> Queue.push x sel_feedback_queue) in
242-
let event, sel_cancellation_handle = local_feedback sel_feedback_queue in
238+
let event = local_feedback sel_feedback_queue in
239+
let sel_cancellation_handle = Sel.Event.get_cancellation_handle event in
243240
{
244241
initial = vernac_state;
245242
of_sentence = SM.empty;
@@ -255,7 +252,7 @@ let init vernac_state =
255252
let feedback_cleanup { coq_feeder; sel_feedback_queue; sel_cancellation_handle } =
256253
Feedback.del_feeder coq_feeder;
257254
Queue.clear sel_feedback_queue;
258-
Sel.cancel sel_cancellation_handle
255+
Sel.Event.cancel sel_cancellation_handle
259256

260257
let handle_feedback id fb state =
261258
match fb with
@@ -270,8 +267,8 @@ let handle_feedback id fb state =
270267

271268
let handle_event event state =
272269
match event with
273-
| LocalFeedback (_,id,fb) ->
274-
Some (handle_feedback id fb state), []
270+
| LocalFeedback (q,_,id,fb) ->
271+
Some (handle_feedback id fb state), [local_feedback q]
275272
| ProofWorkerEvent event ->
276273
let update, events = ProofWorker.handle_event event in
277274
let state =
@@ -302,12 +299,12 @@ let find_fulfilled_opt x m =
302299
| Delegated _ -> None
303300
with Not_found -> None
304301

305-
let jobs : (DelegationManager.job_handle * Sel.cancellation_handle * ProofJob.t) Queue.t = Queue.create ()
302+
let jobs : (DelegationManager.job_handle * Sel.Event.cancellation_handle * ProofJob.t) Queue.t = Queue.create ()
306303

307304
(* TODO: kill all Delegated... *)
308305
let destroy st =
309306
feedback_cleanup st;
310-
Queue.iter (fun (h,c,_) -> DelegationManager.cancel_job h; Sel.cancel c) jobs
307+
Queue.iter (fun (h,c,_) -> DelegationManager.cancel_job h; Sel.Event.cancel c) jobs
311308

312309

313310
let last_opt l = try Some (CList.last l).id with Failure _ -> None
@@ -447,12 +444,12 @@ let execute st (vs, events, interrupted) task =
447444
else
448445
update_all id (Delegated (job_id,None)) [] st)
449446
st (List.map id_of_prepared_task tasks) in
450-
let e, cancellation =
447+
let e =
451448
ProofWorker.worker_available ~jobs
452449
~fork_action:worker_main
453450
~feedback_cleanup:(fun () -> feedback_cleanup st)
454451
in
455-
Queue.push (job_id, cancellation, job) jobs;
452+
Queue.push (job_id, Sel.Event.get_cancellation_handle e, job) jobs;
456453
(st, last_vs,events @ [inject_proof_event e] ,false)
457454
| _ ->
458455
(* If executing the proof opener failed, we skip the proof *)
@@ -564,7 +561,7 @@ let rec invalidate schedule id st =
564561
if terminator_id != id then
565562
Queue.push job jobs
566563
else begin
567-
Sel.cancel cancellation;
564+
Sel.Event.cancel cancellation;
568565
removed := tasks :: !removed
569566
end) old_jobs;
570567
let of_sentence = List.fold_left invalidate1 of_sentence

language-server/dm/executionManager.mli

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,10 +35,10 @@ val is_diagnostics_enabled: unit -> bool
3535
(** Execution state, includes the cache *)
3636
type state
3737
type event
38-
type events = event Sel.event list
38+
type events = event Sel.Event.t list
3939
val pr_event : event -> Pp.t
4040

41-
val init : Vernacstate.t -> state * event Sel.event
41+
val init : Vernacstate.t -> state * event Sel.Event.t
4242
val destroy : state -> unit
4343

4444
val get_options : unit -> options

language-server/dm/log.ml

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ let mk_log name =
6464
let logs () = List.sort String.compare !logs
6565

6666
type event = string
67-
type events = event Sel.event list
67+
type events = event Sel.Event.t list
6868

6969
let install_debug_feedback f =
7070
Feedback.add_feeder (fun fb ->
@@ -77,13 +77,9 @@ let install_debug_feedback f =
7777
let coq_debug_feedback_queue = Queue.create ()
7878
let main_debug_feeder = install_debug_feedback (fun txt -> Queue.push txt coq_debug_feedback_queue)
7979

80-
let (debug, cancel_debug_event) : event Sel.event * Sel.cancellation_handle =
81-
Sel.on_queue coq_debug_feedback_queue (fun x -> x) |>
82-
fun (e, cancellation) ->
83-
(e |> Sel.name "debug"
84-
|> Sel.make_recurring
85-
|> Sel.set_priority PriorityManager.feedback),
86-
cancellation
80+
let debug : event Sel.Event.t =
81+
Sel.On.queue ~name:"debug" ~priority:PriorityManager.feedback coq_debug_feedback_queue (fun x -> x)
82+
let cancel_debug_event = Sel.Event.get_cancellation_handle debug
8783

8884
let lsp_initialization_done () =
8985
lsp_initialization_done := true;
@@ -93,7 +89,7 @@ let lsp_initialization_done () =
9389
[debug]
9490

9591
let worker_initialization_begins () =
96-
Sel.cancel cancel_debug_event;
92+
Sel.Event.cancel cancel_debug_event;
9793
Feedback.del_feeder main_debug_feeder;
9894
(* We do not want to inherit master's Feedback reader (feeder), otherwise we
9995
would output on the worker's stderr.

language-server/dm/log.mli

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ val mk_log : string -> (string -> unit) log
1818
val logs : unit -> string list
1919

2020
type event
21-
type events = event Sel.event list
21+
type events = event Sel.Event.t list
2222

2323
val lsp_initialization_done : unit -> events
2424
val handle_event : event -> unit

language-server/dm/parTactic.ml

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -104,22 +104,22 @@ let interp_par ~pstate ~info ast ~abstract ~with_end_tac : Declare.Proof.t =
104104
(Proof.data p).Proof.goals |> CList.map_i (fun goalno goal ->
105105
let job = { TacticJob.state; ast; goalno = goalno + 1; goal; name = string_of_int (Evar.repr goal)} in
106106
let job_id = DelegationManager.mk_job_handle !feedback_id in
107-
let e, cancellation =
107+
let e =
108108
TacticWorker.worker_available ~feedback_cleanup:(fun _ -> ()) (* not really correct, since there is a cleanup to be done, but it concern a sel loop which is dead (we don't come back to it), so we can ignore the problem *)
109109
~jobs:queue ~fork_action:worker_solve_one_goal in
110-
Queue.push (job_id, cancellation, job) queue;
110+
Queue.push (job_id, Sel.Event.get_cancellation_handle e, job) queue;
111111
e, job_id
112112
) 0) in
113113
let rec wait acc evs =
114-
log @@ "waiting for events: " ^ string_of_int @@ Sel.size evs;
114+
log @@ "waiting for events: " ^ string_of_int @@ Sel.Todo.size evs;
115115
let more_ready, evs = Sel.pop_opt evs in
116116
match more_ready with
117117
| None ->
118-
if Sel.nothing_left_to_do evs then (log @@ "done waiting for tactic workers"; acc)
118+
if Sel.Todo.is_empty evs then (log @@ "done waiting for tactic workers"; acc)
119119
else wait acc evs (* should be assert false *)
120120
| Some ev ->
121121
let result, more_events = TacticWorker.handle_event ev in
122-
let evs = Sel.enqueue evs more_events in
122+
let evs = Sel.Todo.add evs more_events in
123123
match result with
124124
| None -> wait acc evs
125125
| Some(TacticJob.UpdateSolution(ev,TacticJob.Solved(c,u))) ->
@@ -135,7 +135,7 @@ let interp_par ~pstate ~info ast ~abstract ~with_end_tac : Declare.Proof.t =
135135
log @@ "got error for " ^ Pp.string_of_ppcmds @@ Evar.print ev;
136136
List.iter DelegationManager.cancel_job job_ids;
137137
CErrors.user_err err in
138-
let results = wait [] Sel.(enqueue empty events) in
138+
let results = wait [] Sel.Todo.(add empty events) in
139139
Declare.Proof.map pstate ~f:(fun p ->
140140
let p,_,() = Proof.run_tactic (Global.env()) (assign_tac ~abstract results) p in
141141
p)

language-server/dm/searchQuery.ml

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,8 @@ open Pp
2020
vscoq process, which does not allow for real asynchronous processing of results. *)
2121
let query_results_queue = Queue.create ()
2222

23-
let query_feedback : notification Sel.event =
24-
Sel.on_queue query_results_queue (fun x -> QueryResultNotification x)
25-
|> Sel.uncancellable
23+
let query_feedback : notification Sel.Event.t =
24+
Sel.On.queue query_results_queue (fun x -> QueryResultNotification x)
2625

2726
(* TODO : remove these two functions when interp_search_restriction is
2827
added in the comSearch.mli in Coq (they're simply copied here for now) *)

language-server/dm/searchQuery.mli

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,12 +13,12 @@
1313
(**************************************************************************)
1414
open Protocol.LspWrapper
1515

16-
val query_feedback : notification Sel.event
16+
val query_feedback : notification Sel.Event.t
1717

1818
val interp_search :
1919
id:string ->
2020
Environ.env ->
2121
Evd.evar_map ->
2222
(bool * Vernacexpr.search_request) list ->
2323
Vernacexpr.search_restriction ->
24-
notification Sel.event list
24+
notification Sel.Event.t list

0 commit comments

Comments
 (0)