Skip to content

Commit 4b5c49e

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 4b5c49e

File tree

1 file changed

+6
-2
lines changed

1 file changed

+6
-2
lines changed

lib/logger.rb

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

380380
include Severity
381381

382+
DefaultLevelOverride =
383+
defined?(ObjectSpace::WeakKeyMap) ? ObjectSpace::WeakKeyMap : Hash
384+
private_constant :DefaultLevelOverride
385+
382386
# Logging severity threshold (e.g. <tt>Logger::INFO</tt>).
383387
def level
384388
level_override[level_key] || @level
@@ -606,7 +610,7 @@ def initialize(logdev, shift_age = 0, shift_size = 1048576, level: DEBUG,
606610
self.datetime_format = datetime_format
607611
self.formatter = formatter
608612
@logdev = nil
609-
@level_override = {}
613+
@level_override = DefaultLevelOverride.new
610614
return unless logdev
611615
case logdev
612616
when File::NULL
@@ -789,7 +793,7 @@ def level_override
789793
does not call super probably
790794
;;;
791795
end
792-
@level_override ||= {}
796+
@level_override ||= DefaultLevelOverride.new
793797
end
794798

795799
def level_key

0 commit comments

Comments
 (0)