Skip to content

Commit 638813b

Browse files
split locks into stream_lock and message_limits_lock
1 parent c84046f commit 638813b

File tree

2 files changed

+19
-11
lines changed

2 files changed

+19
-11
lines changed

base/logging/ConsoleLogger.jl

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,9 @@ interactive work with the Julia REPL.
99
1010
Log levels less than `min_level` are filtered out.
1111
12+
This Logger is thread-safe, with locks for both orchestration of message
13+
limits i.e. `maxlog`, and writes to the stream.
14+
1215
Message formatting can be controlled by setting keyword arguments:
1316
1417
* `meta_formatter` is a function which takes the log event metadata
@@ -24,29 +27,30 @@ Message formatting can be controlled by setting keyword arguments:
2427
"""
2528
struct ConsoleLogger <: AbstractLogger
2629
stream::IO
30+
stream_lock::ReentrantLock
2731
min_level::LogLevel
2832
meta_formatter
2933
show_limited::Bool
3034
right_justify::Int
3135
message_limits::Dict{Any,Int}
32-
lock::ReentrantLock
36+
message_limits_lock::ReentrantLock
3337
end
3438
function ConsoleLogger(stream::IO, min_level=Info;
3539
meta_formatter=default_metafmt, show_limited=true,
3640
right_justify=0)
37-
ConsoleLogger(stream, min_level, meta_formatter,
41+
ConsoleLogger(stream, ReentrantLock(), min_level, meta_formatter,
3842
show_limited, right_justify, Dict{Any,Int}(), ReentrantLock())
3943
end
4044
function ConsoleLogger(min_level=Info;
4145
meta_formatter=default_metafmt, show_limited=true,
4246
right_justify=0)
43-
ConsoleLogger(closed_stream, min_level, meta_formatter,
47+
ConsoleLogger(closed_stream, ReentrantLock(), min_level, meta_formatter,
4448
show_limited, right_justify, Dict{Any,Int}(), ReentrantLock())
4549
end
4650

4751

4852
shouldlog(logger::ConsoleLogger, level, _module, group, id) =
49-
@lock logger.lock get(logger.message_limits, id, 1) > 0
53+
@lock logger.message_limits_lock get(logger.message_limits, id, 1) > 0
5054

5155
min_enabled_level(logger::ConsoleLogger) = logger.min_level
5256

@@ -110,7 +114,7 @@ function handle_message(logger::ConsoleLogger, level::LogLevel, message, _module
110114
hasmaxlog = haskey(kwargs, :maxlog) ? 1 : 0
111115
maxlog = get(kwargs, :maxlog, nothing)
112116
if maxlog isa Core.BuiltinInts
113-
@lock logger.lock begin
117+
@lock logger.message_limits_lock begin
114118
remaining = get!(logger.message_limits, id, Int(maxlog)::Int)
115119
logger.message_limits[id] = remaining - 1
116120
remaining > 0 || return
@@ -188,6 +192,6 @@ function handle_message(logger::ConsoleLogger, level::LogLevel, message, _module
188192
end
189193

190194
b = take!(buf)
191-
@lock logger.lock write(stream, b)
195+
@lock logger.stream_lock write(stream, b)
192196
nothing
193197
end

base/logging/logging.jl

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -664,18 +664,22 @@ close(closed_stream)
664664
Simplistic logger for logging all messages with level greater than or equal to
665665
`min_level` to `stream`. If stream is closed then messages with log level
666666
greater or equal to `Warn` will be logged to `stderr` and below to `stdout`.
667+
668+
This Logger is thread-safe, with a lock taken around orchestration of message
669+
limits i.e. `maxlog`, and writes to the stream.
667670
"""
668671
struct SimpleLogger <: AbstractLogger
669672
stream::IO
673+
stream_lock::ReentrantLock
670674
min_level::LogLevel
671675
message_limits::Dict{Any,Int}
672-
lock::ReentrantLock
676+
message_limits_lock::ReentrantLock
673677
end
674-
SimpleLogger(stream::IO, level=Info) = SimpleLogger(stream, level, Dict{Any,Int}(), ReentrantLock())
678+
SimpleLogger(stream::IO, level=Info) = SimpleLogger(stream, ReentrantLock(), level, Dict{Any,Int}(), ReentrantLock())
675679
SimpleLogger(level=Info) = SimpleLogger(closed_stream, level)
676680

677681
shouldlog(logger::SimpleLogger, level, _module, group, id) =
678-
@lock logger.lock get(logger.message_limits, id, 1) > 0
682+
@lock logger.message_limits_lock get(logger.message_limits, id, 1) > 0
679683

680684
min_enabled_level(logger::SimpleLogger) = logger.min_level
681685

@@ -686,7 +690,7 @@ function handle_message(logger::SimpleLogger, level::LogLevel, message, _module,
686690
@nospecialize
687691
maxlog = get(kwargs, :maxlog, nothing)
688692
if maxlog isa Core.BuiltinInts
689-
@lock logger.lock begin
693+
@lock logger.message_limits_lock begin
690694
remaining = get!(logger.message_limits, id, Int(maxlog)::Int)
691695
logger.message_limits[id] = remaining - 1
692696
remaining > 0 || return
@@ -711,7 +715,7 @@ function handle_message(logger::SimpleLogger, level::LogLevel, message, _module,
711715
end
712716
println(iob, "└ @ ", _module, " ", filepath, ":", line)
713717
b = take!(buf)
714-
@lock logger.lock write(stream, b)
718+
@lock logger.stream_lock write(stream, b)
715719
nothing
716720
end
717721

0 commit comments

Comments
 (0)