Skip to content

Commit 4576128

Browse files
committed
Use ObjectSpace::WeakKeyMap for level_override
This allows fiber keys to be GCed and removed from the map. Otherwise, fibers that call `#with_level` create a memory leak if they are killed without running their ensure blocks.
1 parent 7827b54 commit 4576128

1 file changed

Lines changed: 10 additions & 2 deletions

File tree

lib/logger.rb

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -379,6 +379,14 @@ class Logger
379379

380380
include Severity
381381

382+
# Must respond to .new and return a Hash-like object.
383+
# The returned object must respond to #[], #[]=, #delete.
384+
#
385+
# ObjectSpace::WeakKeyMap when supported.
386+
OverrideMap =
387+
defined?(ObjectSpace::WeakKeyMap) ? ObjectSpace::WeakKeyMap : Hash
388+
private_constant :OverrideMap
389+
382390
# Logging severity threshold (e.g. <tt>Logger::INFO</tt>).
383391
def level
384392
level_override[level_key] || @level
@@ -606,7 +614,7 @@ def initialize(logdev, shift_age = 0, shift_size = 1048576, level: DEBUG,
606614
self.datetime_format = datetime_format
607615
self.formatter = formatter
608616
@logdev = nil
609-
@level_override = {}
617+
@level_override = OverrideMap.new
610618
return unless logdev
611619
case logdev
612620
when File::NULL
@@ -789,7 +797,7 @@ def level_override
789797
does not call super probably
790798
;;;
791799
end
792-
@level_override ||= {}
800+
@level_override ||= OverrideMap.new
793801
end
794802

795803
def level_key

0 commit comments

Comments
 (0)