diff options
author | Mario Visic <mario@mariovisic.com> | 2013-10-29 13:04:04 +1100 |
---|---|---|
committer | Mario Visic <mario@mariovisic.com> | 2013-12-06 10:24:06 +1100 |
commit | ffe99774bb0b64644dc419ba83d131218854d404 (patch) | |
tree | 8886f4bd9a889d828410d1bf8d43f0fed2afa4db /activesupport | |
parent | dbdbda9a4a5cb9cd22e7a5a5625caa84edae6d5d (diff) | |
download | rails-ffe99774bb0b64644dc419ba83d131218854d404.tar.gz rails-ffe99774bb0b64644dc419ba83d131218854d404.tar.bz2 rails-ffe99774bb0b64644dc419ba83d131218854d404.zip |
Fix issue with Kernel#silence_stream leaking file descriptors
Calling Kernel#silence_stream creates a new file descriptor which isn't
closed after it is used. As a result calling silence_stream multiple
times leads to a build up of loose file descriptors and can cause issues
in environments where garbage collection isn't run often.
Diffstat (limited to 'activesupport')
-rw-r--r-- | activesupport/CHANGELOG.md | 4 | ||||
-rw-r--r-- | activesupport/lib/active_support/core_ext/kernel/reporting.rb | 1 | ||||
-rw-r--r-- | activesupport/test/core_ext/kernel_test.rb | 16 |
3 files changed, 21 insertions, 0 deletions
diff --git a/activesupport/CHANGELOG.md b/activesupport/CHANGELOG.md index ea4aaff610..d23b598144 100644 --- a/activesupport/CHANGELOG.md +++ b/activesupport/CHANGELOG.md @@ -1,3 +1,7 @@ +* Fix file descriptor being leaked on each call to `Kernel.silence_stream` + + *Mario Visic* + * Ensure `config.i18n.enforce_available_locales` is set before any other configuration option. diff --git a/activesupport/lib/active_support/core_ext/kernel/reporting.rb b/activesupport/lib/active_support/core_ext/kernel/reporting.rb index df11737a6b..3b5e205244 100644 --- a/activesupport/lib/active_support/core_ext/kernel/reporting.rb +++ b/activesupport/lib/active_support/core_ext/kernel/reporting.rb @@ -48,6 +48,7 @@ module Kernel yield ensure stream.reopen(old_stream) + old_stream.close end # Blocks and ignores any exception passed as argument if raised within the block. diff --git a/activesupport/test/core_ext/kernel_test.rb b/activesupport/test/core_ext/kernel_test.rb index b8951de402..18b251173f 100644 --- a/activesupport/test/core_ext/kernel_test.rb +++ b/activesupport/test/core_ext/kernel_test.rb @@ -38,6 +38,22 @@ class KernelTest < ActiveSupport::TestCase # Skip if we can't STDERR.tell end + def test_silence_stream + old_stream_position = STDOUT.tell + silence_stream(STDOUT) { STDOUT.puts 'hello world' } + assert_equal old_stream_position, STDOUT.tell + rescue Errno::ESPIPE + # Skip if we can't stream.tell + end + + def test_silence_stream_closes_file_descriptors + stream = StringIO.new + dup_stream = StringIO.new + stream.stubs(:dup).returns(dup_stream) + dup_stream.expects(:close) + silence_stream(stream) { stream.puts 'hello world' } + end + def test_quietly old_stdout_position, old_stderr_position = STDOUT.tell, STDERR.tell quietly do |