Skip to content

Commit 70bee94

Browse files
committed
Merge branch 'master' into dune-universe-v0.10.0
2 parents df7ca98 + ecc925b commit 70bee94

File tree

6 files changed

+65
-24
lines changed

6 files changed

+65
-24
lines changed

B0.ml

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,9 @@ let test_multi =
8080
let test_threaded =
8181
test ~/"test/test_threaded.ml" ~requires:[logs_fmt; logs_threaded; threads]
8282

83+
let test_mutext_safe =
84+
test ~/"test/test_mutex_safe.ml" ~requires:[logs_fmt; logs_threaded; threads]
85+
8386
let test_lwt =
8487
let requires = [b0_std; logs_fmt; logs_lwt; fmt; fmt_tty; lwt; lwt_unix] in
8588
test ~/"test/test_lwt.ml" ~requires
@@ -121,7 +124,7 @@ let default =
121124
[ "ocaml", {|>= "4.14.0"|};
122125
"ocamlfind", {|build|};
123126
"ocamlbuild", {|build|};
124-
"topkg", {|build & >= "1.0.3"|};
127+
"topkg", {|build & >= "1.1.0"|};
125128
"mtime", {|with-test|};]
126129
in
127130
B0_pack.make "default" ~doc:"logs package" ~meta ~locked:true @@

CHANGES.md

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,8 @@
1+
2+
3+
* Make log mutex immune to raising logging functions.
4+
Thanks to Nathan Taylor for the report and the repro (#57).
5+
16
v0.9.0 2025-07-08 Zagreb
27
------------------------
38

@@ -11,7 +16,7 @@ v0.9.0 2025-07-08 Zagreb
1116
* `Logs.format_reporter` and `Logs_fmt.reporter` replace a few format
1217
strings and `^^` uses by direct calls to `Format` primitives.
1318
* Requires OCaml >= 4.14.
14-
* Use Format.pp_print_text instead of your own.
19+
* Use Format.pp_print_text instead of our own.
1520
* Export `logs` from each sub library.
1621

1722
v0.8.0 2025-03-10 La Forclaz (VS)

src/cli/logs_cli.mli

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -46,27 +46,30 @@ let hello _ msg =
4646
Logs.warn (fun m -> m "Something bad may happen in the future.");
4747
if Logs.err_count () > 0 then 1 else 0
4848
49-
let setup_log style_renderer level =
49+
let setup_log ~style_renderer ~level =
5050
Fmt_tty.setup_std_outputs ?style_renderer ();
5151
Logs.set_level level;
5252
Logs.set_reporter (Logs_fmt.reporter ())
5353
5454
(* Command line interface *)
5555
5656
open Cmdliner
57+
open Cmdliner.Term.Syntax
5758
58-
let setup_log =
59+
let cmd =
60+
Cmd.make (Cmd.info "tool") @@
5961
let env = Cmd.Env.info "TOOL_VERBOSITY" in
60-
Term.(const setup_log $ Fmt_cli.style_renderer () $ Logs_cli.level ~env ())
62+
let+ style_renderer = Fmt_cli.style_renderer ()
63+
and+ level = Logs_cli.level ~env ()
64+
and+ msg =
65+
let doc = "The message to output." in
66+
Arg.(value & pos 0 string "Hello horrible world!" & info [] ~doc)
67+
in
68+
setup_log ~style_renderer ~level;
69+
hello msg
6170
62-
let msg =
63-
let doc = "The message to output." in
64-
Arg.(value & pos 0 string "Hello horrible world!" & info [] ~doc)
65-
66-
let main () =
67-
let cmd = Cmd.make (Cmd.info "tool") Term.(const hello $ setup_log $ msg) in
68-
Cmd.eval' cmd
6971
72+
let main () = Cmd.eval' cmd
7073
let () = if !Sys.interactive then () else exit (main ())
7174
]}
7275

src/logs.ml

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -188,7 +188,11 @@ let report src level ~over k msgf =
188188
let mutex = Atomic.get reporter_mutex' in
189189
let over () = over (); mutex.unlock () in
190190
mutex.lock ();
191-
(Atomic.get reporter').report src level ~over k msgf
191+
try (Atomic.get reporter').report src level ~over k msgf with
192+
| exn ->
193+
let bt = Printexc.get_raw_backtrace () in
194+
over ();
195+
Printexc.raise_with_backtrace exn bt
192196

193197
let pp_brackets pp_v ppf v =
194198
Format.pp_print_char ppf '['; pp_v ppf v; Format.pp_print_char ppf ']'

test/test_mutex_safe.ml

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
(*---------------------------------------------------------------------------
2+
Copyright (c) 2025 The logs programmers. All rights reserved.
3+
SPDX-License-Identifier: ISC
4+
---------------------------------------------------------------------------*)
5+
6+
(* See https://github.com/dbuenzli/logs/issues/57 *)
7+
8+
let src = Logs.Src.create "repro case"
9+
module Log = (val Logs.src_log src)
10+
11+
let setup_logs () =
12+
Logs.set_reporter (Logs_fmt.reporter ());
13+
Logs.set_level ~all:true (Some Logs.Debug);
14+
Logs_threaded.enable ();
15+
()
16+
17+
let main () =
18+
setup_logs ();
19+
(try Logs.app (fun _m -> failwith "uh oh...") with Failure _ -> ());
20+
Logs.app (fun m -> m "It works!");
21+
0
22+
23+
let () = if !Sys.interactive then () else exit (main ())

test/tool.ml

Lines changed: 14 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2,33 +2,36 @@
22

33
(* Example setup for a simple command line tool with colorful output. *)
44

5-
let hello _ msg =
5+
let hello msg =
66
Logs.app (fun m -> m "%s" msg);
77
Logs.info (fun m -> m "End-user information.");
88
Logs.debug (fun m -> m "Developer information.");
99
Logs.err (fun m -> m "Something bad happened.");
1010
Logs.warn (fun m -> m "Something bad may happen in the future.");
1111
if Logs.err_count () > 0 then 1 else 0
1212

13-
let setup_log style_renderer level =
13+
let setup_log ~style_renderer ~level =
1414
Fmt_tty.setup_std_outputs ?style_renderer ();
1515
Logs.set_level level;
1616
Logs.set_reporter (Logs_fmt.reporter ())
1717

1818
(* Command line interface *)
1919

2020
open Cmdliner
21+
open Cmdliner.Term.Syntax
2122

22-
let setup_log =
23+
let cmd =
24+
Cmd.make (Cmd.info "tool") @@
2325
let env = Cmd.Env.info "TOOL_VERBOSITY" in
24-
Term.(const setup_log $ Fmt_cli.style_renderer () $ Logs_cli.level ~env ())
26+
let+ style_renderer = Fmt_cli.style_renderer ()
27+
and+ level = Logs_cli.level ~env ()
28+
and+ msg =
29+
let doc = "The message to output." in
30+
Arg.(value & pos 0 string "Hello horrible world!" & info [] ~doc)
31+
in
32+
setup_log ~style_renderer ~level;
33+
hello msg
2534

26-
let msg =
27-
let doc = "The message to output." in
28-
Arg.(value & pos 0 string "Hello horrible world!" & info [] ~doc)
29-
30-
let main () =
31-
let cmd = Cmd.v (Cmd.info "tool") Term.(const hello $ setup_log $ msg) in
32-
Cmd.eval' cmd
3335

36+
let main () = Cmd.eval' cmd
3437
let () = if !Sys.interactive then () else exit (main ())

0 commit comments

Comments
 (0)