diff options
author | nagachika <nagachika@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2014-05-04 17:32:44 +0000 |
---|---|---|
committer | nagachika <nagachika@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2014-05-04 17:32:44 +0000 |
commit | acd893d1755cc87542f36131f40c9c3f0aa5bc04 (patch) | |
tree | 82083585ff06e5bac2989c1889bfcb2787a03581 | |
parent | 647b55f64ade31427601fe0eb1d049484d656977 (diff) |
merge revision(s) r45291,r45299,r45314,r45325: [Backport #9518]
* ext/dl/cptr.c (dlptr_free), ext/dl/handle.c (dlhandle_free),
ext/fiddle/handle.c (fiddle_handle_free),
ext/fiddle/pointer.c (fiddle_ptr_free): fix memory leak.
based on the patch Heesob Park at [ruby-dev:48021] [Bug #9599].
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_2_1@45820 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r-- | ChangeLog | 7 | ||||
-rw-r--r-- | ext/dl/cptr.c | 1 | ||||
-rw-r--r-- | ext/dl/handle.c | 1 | ||||
-rw-r--r-- | ext/fiddle/handle.c | 1 | ||||
-rw-r--r-- | ext/fiddle/pointer.c | 1 | ||||
-rw-r--r-- | test/dl/test_cptr.rb | 4 | ||||
-rw-r--r-- | test/dl/test_handle.rb | 4 | ||||
-rw-r--r-- | test/fiddle/test_handle.rb | 7 | ||||
-rw-r--r-- | test/fiddle/test_pointer.rb | 4 | ||||
-rw-r--r-- | test/ruby/envutil.rb | 4 | ||||
-rw-r--r-- | version.h | 2 |
11 files changed, 33 insertions, 3 deletions
@@ -1,3 +1,10 @@ +Mon May 5 02:21:48 2014 Nobuyoshi Nakada <nobu@ruby-lang.org> + + * ext/dl/cptr.c (dlptr_free), ext/dl/handle.c (dlhandle_free), + ext/fiddle/handle.c (fiddle_handle_free), + ext/fiddle/pointer.c (fiddle_ptr_free): fix memory leak. + based on the patch Heesob Park at [ruby-dev:48021] [Bug #9599]. + Mon May 5 01:20:27 2014 Eric Wong <e@80x24.org> * gc.c (rb_gc_writebarrier): drop special case for big hash/array diff --git a/ext/dl/cptr.c b/ext/dl/cptr.c index 3f8858c4b3..d34309379b 100644 --- a/ext/dl/cptr.c +++ b/ext/dl/cptr.c @@ -49,6 +49,7 @@ dlptr_free(void *ptr) (*(data->free))(data->ptr); } } + xfree(ptr); } static size_t diff --git a/ext/dl/handle.c b/ext/dl/handle.c index ef182e816f..6b90e089ee 100644 --- a/ext/dl/handle.c +++ b/ext/dl/handle.c @@ -38,6 +38,7 @@ dlhandle_free(void *ptr) if( dlhandle->ptr && dlhandle->open && dlhandle->enable_close ){ dlclose(dlhandle->ptr); } + xfree(ptr); } static size_t diff --git a/ext/fiddle/handle.c b/ext/fiddle/handle.c index 330dbafe67..36970a2248 100644 --- a/ext/fiddle/handle.c +++ b/ext/fiddle/handle.c @@ -40,6 +40,7 @@ fiddle_handle_free(void *ptr) if( fiddle_handle->ptr && fiddle_handle->open && fiddle_handle->enable_close ){ dlclose(fiddle_handle->ptr); } + xfree(ptr); } static size_t diff --git a/ext/fiddle/pointer.c b/ext/fiddle/pointer.c index 0129363a8d..b763a0c123 100644 --- a/ext/fiddle/pointer.c +++ b/ext/fiddle/pointer.c @@ -56,6 +56,7 @@ fiddle_ptr_free(void *ptr) (*(data->free))(data->ptr); } } + xfree(ptr); } static size_t diff --git a/test/dl/test_cptr.rb b/test/dl/test_cptr.rb index c3793859d7..aa74a73fe5 100644 --- a/test/dl/test_cptr.rb +++ b/test/dl/test_cptr.rb @@ -219,4 +219,8 @@ module DL assert_raise(DLError) {nullpo[0] = 1} end end + + def test_no_memory_leak + assert_no_memory_leak(%w[-W0 -rdl.so], '', '100_000.times {DL::CPtr.allocate}', rss: true) + end end diff --git a/test/dl/test_handle.rb b/test/dl/test_handle.rb index 83b8af1960..6a8964e9a0 100644 --- a/test/dl/test_handle.rb +++ b/test/dl/test_handle.rb @@ -184,4 +184,8 @@ module DL DL.dlopen("/lib/libc.so.7").sym('strcpy') end if /freebsd/=~ RUBY_PLATFORM end + + def test_no_memory_leak + assert_no_memory_leak(%w[-W0 -rdl.so], '', '100_000.times {DL::Handle.allocate}; GC.start', rss: true) + end end diff --git a/test/fiddle/test_handle.rb b/test/fiddle/test_handle.rb index c598cc33a2..cde3fa816d 100644 --- a/test/fiddle/test_handle.rb +++ b/test/fiddle/test_handle.rb @@ -1,5 +1,6 @@ begin require_relative 'helper' + require_relative '../ruby/envutil' rescue LoadError end @@ -7,6 +8,8 @@ module Fiddle class TestHandle < TestCase include Fiddle + include Test::Unit::Assertions + def test_to_i handle = Fiddle::Handle.new(LIBC_SO) assert_kind_of Integer, handle.to_i @@ -185,5 +188,9 @@ module Fiddle Socket.gethostbyname("localhost") Fiddle.dlopen("/lib/libc.so.7").sym('strcpy') end if /freebsd/=~ RUBY_PLATFORM + + def test_no_memory_leak + assert_no_memory_leak(%w[-W0 -rfiddle.so], '', '100_000.times {Fiddle::Handle.allocate}; GC.start', rss: true) + end end end if defined?(Fiddle) diff --git a/test/fiddle/test_pointer.rb b/test/fiddle/test_pointer.rb index 1d908f64d9..2ba11b4ed7 100644 --- a/test/fiddle/test_pointer.rb +++ b/test/fiddle/test_pointer.rb @@ -230,5 +230,9 @@ module Fiddle assert_raise(DLError) {nullpo[0]} assert_raise(DLError) {nullpo[0] = 1} end + + def test_no_memory_leak + assert_no_memory_leak(%w[-W0 -rfiddle.so], '', '100_000.times {Fiddle::Pointer.allocate}', rss: true) + end end end if defined?(Fiddle) diff --git a/test/ruby/envutil.rb b/test/ruby/envutil.rb index 5ebcabe901..de66102621 100644 --- a/test/ruby/envutil.rb +++ b/test/ruby/envutil.rb @@ -372,7 +372,7 @@ eom assert_warning(*args) {$VERBOSE = false; yield} end - def assert_no_memory_leak(args, prepare, code, message=nil, limit: 1.5, **opt) + def assert_no_memory_leak(args, prepare, code, message=nil, limit: 1.5, rss: false, **opt) require_relative 'memory_status' token = "\e[7;1m#{$$.to_s}:#{Time.now.strftime('%s.%L')}:#{rand(0x10000).to_s(16)}:\e[m" token_dump = token.dump @@ -397,7 +397,7 @@ eom before = err.sub!(/^#{token_re}START=(\{.*\})\n/, '') && Memory::Status.parse($1) after = err.sub!(/^#{token_re}FINAL=(\{.*\})\n/, '') && Memory::Status.parse($1) assert_equal([true, ""], [status.success?, err], message) - ([:size, :rss] & after.members).each do |n| + ([:size, (rss && :rss)] & after.members).each do |n| b = before[n] a = after[n] next unless a > 0 and b > 0 @@ -1,6 +1,6 @@ #define RUBY_VERSION "2.1.2" #define RUBY_RELEASE_DATE "2014-05-05" -#define RUBY_PATCHLEVEL 90 +#define RUBY_PATCHLEVEL 91 #define RUBY_RELEASE_YEAR 2014 #define RUBY_RELEASE_MONTH 5 |