From f9270e93049e3c79e74fcae0322f1c40526cf058 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Loi=CC=88c=20Correnson?= <loic.correnson@cea.fr> Date: Tue, 25 Aug 2020 16:18:14 +0200 Subject: [PATCH] [kernel] lock only log listeners on rec --- .../plugin_entry_points/log.ml | 26 +++++++++---------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/src/kernel_services/plugin_entry_points/log.ml b/src/kernel_services/plugin_entry_points/log.ml index 9ac3d86df1d..aae66eac586 100644 --- a/src/kernel_services/plugin_entry_points/log.ml +++ b/src/kernel_services/plugin_entry_points/log.ml @@ -419,17 +419,7 @@ let check_not_yet = ref (fun _evt -> false) (* --- Listeners --- *) (* -------------------------------------------------------------------------- *) -let firelock = ref false - -let do_fire e f = - if !firelock then f e else - try - firelock := true ; - f e ; - firelock := false - with exn -> - firelock := false ; - raise exn +let do_fire e f = f e let iter_kind ?kind f ems = match kind with @@ -490,6 +480,8 @@ let logtransient channel text = raise e ) buffer text +let locked_listeners = ref false + let logwithfinal finally channel ?(fire=true) (* fire channel listeners *) ?emitwith (* additional emitter *) @@ -528,8 +520,16 @@ let logwithfinal finally channel if echo && e.echo then do_echo channel.terminal event ; Extlib.may (do_fire event) emitwith; - if fire && not !firelock then - List.iter (do_fire event) e.listeners ; + if fire && not !locked_listeners then + begin + try + locked_listeners := true ; + List.iter (do_fire event) e.listeners ; + locked_listeners := false ; + with exn -> + locked_listeners := false ; + raise exn + end ; Some event end else None -- GitLab