8000 Memory leak when duplicating identhash · github/ruby@c27bc9c · GitHub
[go: up one dir, main page]

Skip to content

Commit c27bc9c

Browse files
peterzhu2118djensenius
authored andcommitted
Memory leak when duplicating identhash
[Bug #20145] Before this commit, both copy_compare_by_id and hash_copy will create a copy of the ST table, so the ST table created in copy_compare_by_id will be leaked. h = { 1 => 2 }.compare_by_identity 10.times do 1_000_000.times do h.select { false } end puts `ps -o rss= -p #{$$}` end Before: 110736 204352 300272 395520 460704 476736 542000 604704 682624 770528 After: 15504 16048 16144 16256 16320 16320 16752 16752 16752 16752
1 parent 5124f9a commit c27bc9c

File tree

2 files changed

+19
-1
lines changed

2 files changed

+19
-1
lines changed

hash.c

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1557,7 +1557,15 @@ hash_copy(VALUE ret, VALUE hash)
15571557
static VALUE
15581558
hash_dup_with_compare_by_id(VALUE hash)
15591559
{
1560-
return hash_copy(copy_compare_by_id(rb_hash_new(), hash), hash);
1560+
VALUE dup = hash_alloc_flags(rb_cHash, 0, Qnil, RHASH_ST_TABLE_P(hash));
1561+
if (RHASH_ST_TABLE_P(hash)) {
1562+
RHASH_SET_ST_FLAG(dup);
1563+
}
1564+
else {
1565+
RHASH_UNSET_ST_FLAG(dup);
1566+
}
1567+
1568+
return hash_copy(dup, hash);
15611569
}
15621570

15631571
static VALUE

test/ruby/test_hash.rb

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1458,6 +1458,16 @@ def test_compare_by_identity
14581458
assert_predicate(h.dup, :compare_by_identity?, bug8703)
14591459
end
14601460

1461+
def test_compare_by_identy_memory_leak
1462+
assert_no_memory_leak([], "", "#{<<~"begin;"}\n#{<<~'end;'}", "[Bug #20145]", rss: true)
1463+
begin;
1464+
h = { 1 => 2 }.compare_by_identity
1465+
1_000_000.times do
1466+
h.select { false }
1467+
end
1468+
end;
1469+
end
1470+
14611471
def test_same_key
14621472
bug9646 = '[ruby-dev:48047] [Bug #9646] Infinite loop at Hash#each'
14631473
h = @cls[a=[], 1]

0 commit comments

Comments
 (0)
0