From: ts Date: 2004-10-23T22:32:17+09:00 Subject: frame_dup(), frame_free() [ruby_core 3456] The original example is in [ruby-core:3456] Personnaly I've still a problem with 1.8 only and frame_dup() If it has a frame_dup(), it must have a frame_free() no ? svg% cat b.rb #!./ruby def assert_raise(arg) yield rescue end def tt Proc.new {} assert_raise(Errno::ENOENT) { yield } end def test_memory_leak system("ps aux | head -1") 100000.times do |i| system("ps aux | grep ruby | grep -v grep | grep -v gdb") if i % 10000 == 0 tt { raise Errno::ENOENT } end end test_memory_leak svg% svg% ./ruby -v b.rb ruby 1.8.2 (2004-10-23) [i686-linux] USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND ts 24852 0.0 0.5 2724 1340 pts/0 S 15:18 0:00 ./ruby -v b.rb ts 24852 0.0 1.3 4772 3416 pts/0 S 15:18 0:00 ./ruby -v b.rb ts 24852 99.9 1.9 6448 5092 pts/0 R 15:18 0:01 ./ruby -v b.rb ts 24852 99.9 2.6 8200 6844 pts/0 S 15:18 0:02 ./ruby -v b.rb ts 24852 96.0 3.3 9888 8532 pts/0 R 15:18 0:02 ./ruby -v b.rb ts 24852 90.2 4.0 11600 10244 pts/0 S 15:18 0:03 ./ruby -v b.rb ts 24852 99.9 4.7 13328 11972 pts/0 S 15:18 0:04 ./ruby -v b.rb ts 24852 99.9 5.3 15016 13660 pts/0 S 15:18 0:05 ./ruby -v b.rb ts 24852 96.8 6.0 16768 15412 pts/0 S 15:18 0:05 ./ruby -v b.rb ts 24852 93.7 6.7 18460 17104 pts/0 S 15:18 0:06 ./ruby -v b.rb svg% svg% diff -up eval.c.old eval.c --- eval.c.old 2004-10-23 15:17:14.000000000 +0200 +++ eval.c 2004-10-23 15:18:32.000000000 +0200 @@ -7743,13 +7743,14 @@ blk_mark(data) } static void -blk_free(data) - struct BLOCK *data; -{ +frame_free(frame) struct FRAME *frame; - void *tmp; +{ + struct FRAME *tmp; - frame = data->frame.prev; + if (frame->argc > 0 && (frame->flags & FRAME_MALLOC)) + free(frame->argv); + frame = frame->prev; while (frame) { if (frame->argc > 0 && (frame->flags & FRAME_MALLOC)) free(frame->argv); @@ -7757,9 +7758,16 @@ blk_free(data) frame = frame->prev; free(tmp); } +} + +static void +blk_free(data) + struct BLOCK *data; +{ + void *tmp; + while (data) { - if (data->frame.argc > 0) - free(data->frame.argv); + frame_free(&data->frame); tmp = data; data = data->prev; free(tmp); svg% svg% ./ruby -v b.rb ruby 1.8.2 (2004-10-23) [i686-linux] USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND ts 25875 0.0 0.5 2732 1344 pts/0 S 15:21 0:00 ./ruby -v b.rb ts 25875 0.0 0.7 3172 1812 pts/0 S 15:21 0:00 ./ruby -v b.rb ts 25875 99.9 0.7 3172 1812 pts/0 S 15:21 0:01 ./ruby -v b.rb ts 25875 82.0 0.7 3172 1812 pts/0 S 15:21 0:01 ./ruby -v b.rb ts 25875 99.9 0.7 3172 1812 pts/0 S 15:21 0:02 ./ruby -v b.rb ts 25875 91.3 0.7 3172 1812 pts/0 S 15:21 0:02 ./ruby -v b.rb ts 25875 99.9 0.7 3172 1812 pts/0 S 15:21 0:03 ./ruby -v b.rb ts 25875 96.0 0.7 3172 1812 pts/0 S 15:21 0:03 ./ruby -v b.rb ts 25875 87.6 0.7 3172 1812 pts/0 S 15:21 0:04 ./ruby -v b.rb ts 25875 99.0 0.7 3172 1812 pts/0 S 15:21 0:04 ./ruby -v b.rb svg% Guy Decoux