[前][次][番号順一覧][スレッド一覧]

ruby-changes:17609

From: ko1 <ko1@a...>
Date: Thu, 28 Oct 2010 03:20:41 +0900 (JST)
Subject: [ruby-changes:17609] Ruby:r29614 (trunk): * ext/objspace/objspace.c (memsize_of): fix rdoc.

ko1	2010-10-28 03:16:39 +0900 (Thu, 28 Oct 2010)

  New Revision: 29614

  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=29614

  Log:
    * ext/objspace/objspace.c (memsize_of): fix rdoc.
    * ext/objspace/objspace.c (total_memsize_of_all_objects): added.
    * test/objspace/test_objspace.rb:
      - add a test for ObjectSpace.total_memsize_of_all_objects.
      - add two tests for ObjectSpace.memsize_of (for nil and Fixnum).

  Modified files:
    trunk/ChangeLog
    trunk/ext/objspace/objspace.c
    trunk/test/objspace/test_objspace.rb

Index: ChangeLog
===================================================================
--- ChangeLog	(revision 29613)
+++ ChangeLog	(revision 29614)
@@ -1,3 +1,13 @@
+Thu Oct 28 03:13:06 2010  Koichi Sasada  <ko1@a...>
+
+	* ext/objspace/objspace.c (memsize_of): fix rdoc.
+
+	* ext/objspace/objspace.c (total_memsize_of_all_objects): added.
+
+	* test/objspace/test_objspace.rb:
+	  - add a test for ObjectSpace.total_memsize_of_all_objects.
+	  - add two tests for ObjectSpace.memsize_of (for nil and Fixnum).
+
 Wed Oct 27 23:55:27 2010  Nobuyoshi Nakada  <nobu@r...>
 
 	* ext/iconv/iconv.c (Init_iconv): warn deprecated use.
Index: ext/objspace/objspace.c
===================================================================
--- ext/objspace/objspace.c	(revision 29613)
+++ ext/objspace/objspace.c	(revision 29614)
@@ -155,9 +155,9 @@
  *
  *  Return consuming memory size of obj.
  *
- *  Note that this information is incomplete.  You need to deal with
+ *  Note that the return size is incomplete.  You need to deal with
  *  this information as only a *HINT*.  Especaially, the size of
- *  T_DATA may not right size.
+ *  T_DATA may not be correct.
  *
  *  This method is not expected to work except C Ruby.
  */
@@ -169,6 +169,53 @@
 }
 
 static int
+total_i(void *vstart, void *vend, size_t stride, void *data)
+{
+    size_t *total_storage = (size_t *)data, total = 0;
+    VALUE v;
+
+    for (v = (VALUE)vstart; v != (VALUE)vend; v += stride) {
+	if (RBASIC(v)->flags) {
+	    total += memsize_of(v);
+	}
+    }
+    *total_storage += total;
+
+    return 0;
+}
+
+/*
+ *  call-seq:
+ *    ObjectSpace.total_memsize_of_all_objects() -> Integer
+ *
+ *  Return consuming memory size of all living objects.
+ *
+ *  Note that the returned size is incomplete.  You need to deal with
+ *  this information as only a *HINT*.  Especaially, the size of
+ *  T_DATA may not be correct.
+ *
+ *  Note that this method does *NOT* return total malloc'ed memory size.
+ *
+ *  This method can be defined by the following Ruby code:
+ *
+ *  def total_memsize_of_all_objects
+ *    total = 0
+ *    ObjectSpace.each_objects{|e| total += ObjectSpace.memsize_of(e)}
+ *    total
+ *  end
+ *
+ *  This method is not expected to work except C Ruby.
+ */
+
+static VALUE
+total_memsize_of_all_objects_m(VALUE self)
+{
+    size_t total;
+    rb_objspace_each_objects(total_i, &total);
+    return SIZET2NUM(total);
+}
+
+static int
 set_zero_i(st_data_t key, st_data_t val, st_data_t arg)
 {
     VALUE k = (VALUE)key;
@@ -544,8 +591,11 @@
 {
     VALUE rb_mObjSpace = rb_const_get(rb_cObject, rb_intern("ObjectSpace"));
 
+    rb_define_module_function(rb_mObjSpace, "memsize_of", memsize_of_m, 1);
+    rb_define_module_function(rb_mObjSpace, "total_memsize_of_all_objects",
+			      total_memsize_of_all_objects_m, 0);
+
     rb_define_module_function(rb_mObjSpace, "count_objects_size", count_objects_size, -1);
-    rb_define_module_function(rb_mObjSpace, "memsize_of", memsize_of_m, 1);
     rb_define_module_function(rb_mObjSpace, "count_nodes", count_nodes, -1);
     rb_define_module_function(rb_mObjSpace, "count_tdata_objects", count_tdata_objects, -1);
 }
Index: test/objspace/test_objspace.rb
===================================================================
--- test/objspace/test_objspace.rb	(revision 29613)
+++ test/objspace/test_objspace.rb	(revision 29614)
@@ -4,6 +4,8 @@
 class TestObjSpace < Test::Unit::TestCase
   def test_memsize_of
     assert_equal(0, ObjectSpace.memsize_of(true))
+    assert_equal(0, ObjectSpace.memsize_of(nil))
+    assert_equal(0, ObjectSpace.memsize_of(1))
     assert_kind_of(Integer, ObjectSpace.memsize_of(Object.new))
     assert_kind_of(Integer, ObjectSpace.memsize_of(Class))
     assert_kind_of(Integer, ObjectSpace.memsize_of(""))
@@ -17,6 +19,10 @@
     assert_kind_of(Integer, ObjectSpace.memsize_of(Struct.new(:a)))
   end
 
+  def test_total_memsize_of_all_objects
+    assert_kind_of(Integer, ObjectSpace.total_memsize_of_all_objects)
+  end
+
   def test_count_objects_size
     res = ObjectSpace.count_objects_size
     assert_equal(false, res.empty?)

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]