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

ruby-changes:20623

From: mame <ko1@a...>
Date: Tue, 26 Jul 2011 00:18:02 +0900 (JST)
Subject: [ruby-changes:20623] mame:r32671 (trunk): * proc.c: pre-allocate the unlinked_method_entry_list_entry struct to

mame	2011-07-26 00:17:56 +0900 (Tue, 26 Jul 2011)

  New Revision: 32671

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

  Log:
    * proc.c: pre-allocate the unlinked_method_entry_list_entry struct to
      avoid memory allocation during GC.  based on a patch from Eric Wong.
      [ruby-core:38498]

  Modified files:
    trunk/ChangeLog
    trunk/proc.c

Index: ChangeLog
===================================================================
--- ChangeLog	(revision 32670)
+++ ChangeLog	(revision 32671)
@@ -1,3 +1,9 @@
+Mon Jul 25 23:51:01 2011  Yusuke Endoh  <mame@t...>
+
+	* proc.c: pre-allocate the unlinked_method_entry_list_entry struct to
+	  avoid memory allocation during GC.  based on a patch from Eric Wong.
+	  [ruby-core:38498]
+
 Mon Jul 25 23:39:33 2011  NAKAMURA Usaku  <usa@r...>
 
 	* test/rake/test_rake_directory_task.rb (TestRakeDirectoryTask#
Index: proc.c
===================================================================
--- proc.c	(revision 32670)
+++ proc.c	(revision 32671)
@@ -19,6 +19,7 @@
     VALUE rclass;
     ID id;
     rb_method_entry_t *me;
+    struct unlinked_method_entry_list_entry *ume;
 };
 
 VALUE rb_cUnboundMethod;
@@ -868,7 +869,10 @@
 bm_free(void *ptr)
 {
     struct METHOD *data = ptr;
-    rb_unlink_method_entry(data->me);
+    struct unlinked_method_entry_list_entry *ume = data->ume;
+    ume->me = data->me;
+    ume->next = GET_VM()->unlinked_method_entry_list;
+    GET_VM()->unlinked_method_entry_list = ume;
     xfree(ptr);
 }
 
@@ -977,6 +981,7 @@
     data->me = ALLOC(rb_method_entry_t);
     *data->me = *me;
     data->me->def->alias_count++;
+    data->ume = ALLOC(struct unlinked_method_entry_list_entry);
 
     OBJ_INFECT(method, klass);
 
@@ -1085,6 +1090,7 @@
     *data->me = *orig->me;
     if (orig->me->def) orig->me->def->alias_count++;
     data->rclass = orig->rclass;
+    data->ume = ALLOC(struct unlinked_method_entry_list_entry);
     OBJ_INFECT(method, obj);
 
     return method;
@@ -1423,6 +1429,7 @@
     data->me = ALLOC(rb_method_entry_t);
     *data->me = *orig->me;
     if (data->me->def) data->me->def->alias_count++;
+    data->ume = ALLOC(struct unlinked_method_entry_list_entry);
 
     return clone;
 }
@@ -1589,6 +1596,7 @@
     if (bound->me->def) bound->me->def->alias_count++;
     bound->recv = recv;
     bound->rclass = CLASS_OF(recv);
+    data->ume = ALLOC(struct unlinked_method_entry_list_entry);
 
     return method;
 }

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

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