From 58f59b29ed35860142e39049ed9d09b2e71f86ab Mon Sep 17 00:00:00 2001
From: Michele Alberti <michele.alberti@cea.fr>
Date: Wed, 29 Jan 2020 16:44:50 +0100
Subject: [PATCH] [db] Rework style and especially the doc.

---
 src/kernel_services/plugin_entry_points/db.ml | 66 ++++++++++---------
 .../plugin_entry_points/db.mli                | 41 ++++++------
 src/plugins/server/main.ml                    |  4 +-
 3 files changed, 59 insertions(+), 52 deletions(-)

diff --git a/src/kernel_services/plugin_entry_points/db.ml b/src/kernel_services/plugin_entry_points/db.ml
index 3db4d315aa2..f89793e2ca5 100644
--- a/src/kernel_services/plugin_entry_points/db.ml
+++ b/src/kernel_services/plugin_entry_points/db.ml
@@ -1064,7 +1064,7 @@ end
 
 type daemon = {
   trigger : unit -> unit ;
-  delayed : (int -> unit) option ;
+  on_delayed : (int -> unit) option ;
   debounced : float ; (* in ms *)
   mutable next_at : float ; (* next trigger time *)
   mutable last_yield_at : float ; (* last yield time *)
@@ -1077,11 +1077,11 @@ let daemons = ref []
 
 let once trigger = pending := trigger :: !pending
 
-let on_progress ?(debounced=0) ?delayed trigger =
+let on_progress ?(debounced=0) ?on_delayed trigger =
   let d = {
     trigger ;
     debounced = float debounced /. 1000.0 ;
-    delayed ;
+    on_delayed ;
     last_yield_at = 0.0 ;
     next_at = 0.0 ;
   } in
@@ -1102,8 +1102,8 @@ let warn_error exn =
     "Unexpected Db.daemon exception:@\n%s"
     (Printexc.to_string exn)
 
-let with_progress ?debounced ?delayed trigger job data =
-  let d = on_progress ?debounced ?delayed trigger in
+let with_progress ?debounced ?on_delayed trigger job data =
+  let d = on_progress ?debounced ?on_delayed trigger in
   let result =
     try job data with e ->
       off_progress d ;
@@ -1124,35 +1124,39 @@ let yield_daemons () =
   match !daemons with
   | [] -> ()
   | ds ->
-    let t = Unix.gettimeofday () in
-    let canceled = ref false in
-    List.iter
-      begin fun d ->
-        let delta = d.debounced in
-        if t > d.next_at then
-          begin
-            try
-              d.next_at <- t +. delta ;
-              d.trigger () ;
-            with Cancel -> canceled := true
+    begin
+      let t = Unix.gettimeofday () in
+      let canceled = ref false in
+      List.iter
+        (fun d ->
+           if t > d.next_at then
+             begin
+               try
+                 d.next_at <- t +. d.debounced ;
+                 d.trigger () ;
+               with
+               | Cancel -> canceled := true
                | exn -> warn_error exn ; raise exn
-          end ;
-        match d.delayed with
-        | None -> ()
-        | Some _ when d.last_yield_at = 0. -> d.last_yield_at <- t (* first yield *)
-        | Some warn ->
-          let period = t -. d.last_yield_at in
-          let delay = if delta > 0.0 then delta else 0.1 in
-          if period > delay then warn (int_of_float (period *. 1000.0)) ;
-          d.last_yield_at <- t ;
-      end ds ;
-    if !canceled then raise Cancel
+             end ;
+           match d.on_delayed with
+           | None ->
+             ()
+           | Some _ when d.last_yield_at = 0. ->
+             (* first yield *)
+             d.last_yield_at <- t
+           | Some warn ->
+             let time_since_last_yield = t -. d.last_yield_at in
+             let delay = if d.debounced > 0.0 then d.debounced else 0.1 in
+             if time_since_last_yield > delay then
+               warn (int_of_float (time_since_last_yield *. 1000.0)) ;
+             d.last_yield_at <- t)
+        ds;
+      if !canceled then raise Cancel
+    end
 
 let yield () =
-  begin
-    yield_daemons () ;
-    yield_once () ;
-  end
+  yield_daemons () ;
+  yield_once ()
 
 let flush () =
   List.iter (fun d -> d.next_at <- 0.0) !daemons ;
diff --git a/src/kernel_services/plugin_entry_points/db.mli b/src/kernel_services/plugin_entry_points/db.mli
index 63cda45fa1f..2b27d5433ee 100644
--- a/src/kernel_services/plugin_entry_points/db.mli
+++ b/src/kernel_services/plugin_entry_points/db.mli
@@ -1343,16 +1343,18 @@ val progress: (unit -> unit) ref
 type daemon
 
 (**
-   Register a new daemon to be executed on [Db.yield()].
-   When specified, two succcessive calls to the daemon will be
-   separated by at least [~debounced] milliseconds (default is 0ms).
-   The [~delayed d] callback is invoked when [Db.yield()] has not been called
-   since a delay [d] greater than [~debounced] or 100ms.
+
+   [on_progress ?debounced ?on_delayed trigger] registers [trigger] as new
+   daemon to be executed on each [yield].
+   @param debounced the least amount of time, in milliseconds, between two
+   successive calls to the daemon (default is 0ms).
+   @param on_delayed the callback invoked as soon as the time since the last
+   [yield] is greater than [debounced] milliseconds (or 100ms at least).
 *)
 val on_progress :
-  ?debounced:int -> ?delayed:(int -> unit) -> (unit -> unit) -> daemon
+  ?debounced:int -> ?on_delayed:(int -> unit) -> (unit -> unit) -> daemon
 
-(** Un-register the daemon. *)
+(** Unregister the [daemon]. *)
 val off_progress : daemon -> unit
 
 (** Trigger all daemons immediately. *)
@@ -1361,27 +1363,27 @@ val flush : unit -> unit
 (** Trigger all registered daemons (debounced). *)
 val yield : unit -> unit
 
-(** Trigger a callback once on next [yield()]. *)
+(** Trigger a callback once on next [yield]. *)
 val once : (unit -> unit) -> unit
 
-(** Raises [Cancel] exception *)
+(** @raise [Cancel] exception. *)
 val cancel : unit -> unit
 
 (**
-   Execute the given job with a temporary registered (debounced) daemon.
-   Details: [with_progress trigger job data] runs [job data] and returns its
-   result, with [trigger] registered as a temporary (debounced) daemon.
-   The daemon is finally flushed and un-registered at the end
-   of the computation, and any exception is re-raised.
-   The callback [~on_mute d] is triggered when the deamon has not been yielded
-   for a period [d] longer than [~debounce] or 100ms by default.
-
+   [with_progress ?debounced ?on_delayed trigger job data] executes the given
+   [job] on [data] while registering [trigger] as temporary (debounced) daemon.
+   The daemon is finally unregistered at the end of the computation.
+   @param debounced the least amount of time, in milliseconds, between two
+   successive calls to the daemon (default is 0ms).
+   @param on_delayed the callback invoked as soon as the time since the last
+   [yield] is greater than [debounced] milliseconds (or 100ms at least).
+   @raise every exception raised during the execution of [job] on [data].
 
    Illustrative example, where [...] is the debounced time:
    {[
        job data :    |<-------------------------------------------------->|<daemon removed>
        yields   :       x   x  x x    x             x   x    x   xxx xxx
-       trigger  :       |..........   |..........   |..........  |...........
+       trigger  :       |..........   |..........   |..........  |.........
        delayed  :                                   !
        notes    :      (1)           (2)           (3)
    ]}
@@ -1390,7 +1392,8 @@ val cancel : unit -> unit
    2. Debounced yields leads to this second trigger
    3. Delayed warning invoked since there was no yield for more than debounced period
 *)
-val with_progress : ?debounced:int -> ?delayed:(int -> unit) ->
+val with_progress :
+  ?debounced:int -> ?on_delayed:(int -> unit) ->
   (unit -> unit) -> ('a -> 'b) -> 'a -> 'b
 
 (** This exception may be raised by {!progress} to interrupt computations. *)
diff --git a/src/plugins/server/main.ml b/src/plugins/server/main.ml
index f6b94ed2083..c628ffc4c34 100644
--- a/src/plugins/server/main.ml
+++ b/src/plugins/server/main.ml
@@ -145,13 +145,13 @@ let execute exec : _ response =
     `Error(exec.id,Printexc.to_string exn)
 
 let execute_debug server yield exec =
-  let delayed =
+  let on_delayed =
     if Senv.debug_atleast 1 then
       (Senv.debug "Trigger %s:%a" exec.request server.pretty exec.id ;
        Some (fun delay -> Senv.debug
                 "No yield since %dms during %s" delay exec.request))
     else None
-  in Db.with_progress ~debounced:server.yield ?delayed yield execute exec
+  in Db.with_progress ~debounced:server.yield ?on_delayed yield execute exec
 
 let reply_debug server resp =
   if Senv.debug_atleast 1 then
-- 
GitLab