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

ruby-changes:8771

From: yugui <ko1@a...>
Date: Sat, 22 Nov 2008 21:12:26 +0900 (JST)
Subject: [ruby-changes:8771] Ruby:r20307 (ruby_1_9_1): merges r20256 from trunk into ruby_1_9_1.

yugui	2008-11-22 21:11:06 +0900 (Sat, 22 Nov 2008)

  New Revision: 20307

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

  Log:
    merges r20256 from trunk into ruby_1_9_1.
    * cont.c (cont_mark, cont_capture, cont_restore_1): speed up
      continuation by copying only valid YARV stack.  [ruby-dev:37106]

  Modified files:
    branches/ruby_1_9_1/ChangeLog
    branches/ruby_1_9_1/cont.c

Index: ruby_1_9_1/ChangeLog
===================================================================
--- ruby_1_9_1/ChangeLog	(revision 20306)
+++ ruby_1_9_1/ChangeLog	(revision 20307)
@@ -1,3 +1,8 @@
+Wed Nov 19 01:05:26 2008  Yusuke Endoh  <mame@t...>
+
+	* cont.c (cont_mark, cont_capture, cont_restore_1): speed up
+	  continuation by copying only valid YARV stack.  [ruby-dev:37106]
+
 Wed Nov 19 00:03:13 2008  Yukihiro Matsumoto  <matz@r...>
 
 	* lib/time.rb: according to RFC2822, -0000 means local time, +0000
Index: ruby_1_9_1/cont.c
===================================================================
--- ruby_1_9_1/cont.c	(revision 20306)
+++ ruby_1_9_1/cont.c	(revision 20307)
@@ -14,6 +14,8 @@
 #include "gc.h"
 #include "eval_intern.h"
 
+#define CAPTURE_JUST_VALID_VM_STACK 1
+
 enum context_type {
     CONTINUATION_CONTEXT = 0,
     FIBER_CONTEXT = 1,
@@ -25,6 +27,10 @@
     VALUE self;
     VALUE value;
     VALUE *vm_stack;
+#ifdef CAPTURE_JUST_VALID_VM_STACK
+    int vm_stack_slen;  /* length of stack (head of th->stack) */
+    int vm_stack_clen;  /* length of control frames (tail of th->stack) */
+#endif
     VALUE *machine_stack;
     VALUE *machine_stack_src;
 #ifdef __ia64
@@ -75,8 +81,13 @@
 	rb_thread_mark(&cont->saved_thread);
 
 	if (cont->vm_stack) {
+#ifdef CAPTURE_JUST_VALID_VM_STACK
 	    rb_gc_mark_locations(cont->vm_stack,
-				 cont->vm_stack + cont->saved_thread.stack_size);
+				 cont->vm_stack + cont->vm_stack_slen + cont->vm_stack_clen);
+#elif
+	    rb_gc_mark_localtion(cont->vm_stack,
+				 cont->vm_stack, cont->saved_thread.stack_size);
+#endif
 	}
 
 	if (cont->machine_stack) {
@@ -247,8 +258,16 @@
     contval = cont->self;
     sth = &cont->saved_thread;
 
+#ifdef CAPTURE_JUST_VALID_VM_STACK
+    cont->vm_stack_slen = th->cfp->sp + th->mark_stack_len - th->stack;
+    cont->vm_stack_clen = th->stack + th->stack_size - (VALUE*)th->cfp;
+    cont->vm_stack = ALLOC_N(VALUE, cont->vm_stack_slen + cont->vm_stack_clen);
+    MEMCPY(cont->vm_stack, th->stack, VALUE, cont->vm_stack_slen);
+    MEMCPY(cont->vm_stack + cont->vm_stack_slen, (VALUE*)th->cfp, VALUE, cont->vm_stack_clen);
+#elif
     cont->vm_stack = ALLOC_N(VALUE, th->stack_size);
     MEMCPY(cont->vm_stack, th->stack, VALUE, th->stack_size);
+#endif
     sth->stack = 0;
 
     cont_save_machine_stack(th, cont);
@@ -288,7 +307,13 @@
 	    th->stack_size = fcont->saved_thread.stack_size;
 	    th->stack = fcont->saved_thread.stack;
 	}
+#ifdef CAPTURE_JUST_VALID_VM_STACK
+	MEMCPY(th->stack, cont->vm_stack, VALUE, cont->vm_stack_slen);
+	MEMCPY(th->stack + sth->stack_size - cont->vm_stack_clen,
+	       cont->vm_stack + cont->vm_stack_slen, VALUE, cont->vm_stack_clen);
+#elif
 	MEMCPY(th->stack, cont->vm_stack, VALUE, sth->stack_size);
+#endif
     }
     else {
 	/* fiber */

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

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