summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authornari <nari@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2012-11-21 13:15:10 +0000
committernari <nari@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2012-11-21 13:15:10 +0000
commitfe9fc6df018402de830f42b63ea25d927c8726a8 (patch)
tree3699ae842164692b7733984698d692a95adbad34
parent4d03af3d9cdedacadc1e967490c9201fec13fc53 (diff)
* gc.c (gc_profile_clear): realloc profile records if its size is
higher than the threshold, GC_PROFILE_RECORD_DEFAULT_SIZE * 2. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@37783 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r--ChangeLog5
-rw-r--r--gc.c11
-rw-r--r--test/ruby/test_gc.rb16
3 files changed, 31 insertions, 1 deletions
diff --git a/ChangeLog b/ChangeLog
index 95d05890bc..90052b83c7 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+Wed Nov 21 22:08:48 2012 Narihiro Nakamura <authornari@gmail.com>
+
+ * gc.c (gc_profile_clear): realloc profile records if its size is
+ higher than the threshold, GC_PROFILE_RECORD_DEFAULT_SIZE * 2.
+
Wed Nov 21 21:53:29 2012 Tadayoshi Funaba <tadf@dotrb.org>
* complex.c (nucomp_to_c): added.
diff --git a/gc.c b/gc.c
index 0265b8e3fd..6906d03ee2 100644
--- a/gc.c
+++ b/gc.c
@@ -3822,6 +3822,7 @@ wmap_aref(VALUE self, VALUE wmap)
*/
static inline void gc_prof_set_heap_info(rb_objspace_t *, gc_profile_record *);
+#define GC_PROFILE_RECORD_DEFAULT_SIZE 100
static double
getrusage_time(void)
@@ -3866,7 +3867,7 @@ gc_prof_timer_start(rb_objspace_t *objspace)
size_t count = objspace->profile.count;
if (!objspace->profile.record) {
- objspace->profile.size = 1000;
+ objspace->profile.size = GC_PROFILE_RECORD_DEFAULT_SIZE;
objspace->profile.record = malloc(sizeof(gc_profile_record) * objspace->profile.size);
}
if (count >= objspace->profile.size) {
@@ -4076,6 +4077,14 @@ static VALUE
gc_profile_clear(void)
{
rb_objspace_t *objspace = &rb_objspace;
+
+ if (GC_PROFILE_RECORD_DEFAULT_SIZE * 2 < objspace->profile.size) {
+ objspace->profile.size = GC_PROFILE_RECORD_DEFAULT_SIZE * 2;
+ objspace->profile.record = realloc(objspace->profile.record, sizeof(gc_profile_record) * objspace->profile.size);
+ if (!objspace->profile.record) {
+ rb_memerror();
+ }
+ }
MEMZERO(objspace->profile.record, gc_profile_record, objspace->profile.size);
objspace->profile.count = 0;
return Qnil;
diff --git a/test/ruby/test_gc.rb b/test/ruby/test_gc.rb
index 39716eb7e2..9fb9550147 100644
--- a/test/ruby/test_gc.rb
+++ b/test/ruby/test_gc.rb
@@ -118,4 +118,20 @@ class TestGc < Test::Unit::TestCase
ensure
GC::Profiler.disable
end
+
+ def test_profiler_clear
+ GC::Profiler.enable
+
+ GC.start
+ assert_equal(1, GC::Profiler.raw_data.size)
+ GC.clear
+ assert_equal(0, GC::Profiler.raw_data.size)
+
+ 200.times{ GC.start }
+ assert_equal(200, GC::Profiler.raw_data.size)
+ GC.clear
+ assert_equal(0, GC::Profiler.raw_data.size)
+ ensure
+ GC::Profiler.disable
+ end
end