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

ruby-changes:18928

From: nobu <ko1@a...>
Date: Thu, 24 Feb 2011 22:52:10 +0900 (JST)
Subject: [ruby-changes:18928] Ruby:r30953 (trunk): * vm.c (ruby_vm_destruct): run vm exit hooks after all objects are

nobu	2011-02-24 22:51:59 +0900 (Thu, 24 Feb 2011)

  New Revision: 30953

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

  Log:
    * vm.c (ruby_vm_destruct): run vm exit hooks after all objects are
      destructed.

  Modified files:
    trunk/ChangeLog
    trunk/eval.c
    trunk/vm.c

Index: ChangeLog
===================================================================
--- ChangeLog	(revision 30952)
+++ ChangeLog	(revision 30953)
@@ -1,3 +1,8 @@
+Thu Feb 24 22:51:54 2011  Nobuyoshi Nakada  <nobu@r...>
+
+	* vm.c (ruby_vm_destruct): run vm exit hooks after all objects are
+	  destructed.
+
 Thu Feb 24 14:40:33 2011  Shota Fukumori  <sorah@t...>
 
 	* ChangeLog (vim): Modeline for vim
Index: eval.c
===================================================================
--- eval.c	(revision 30952)
+++ eval.c	(revision 30953)
@@ -129,9 +129,6 @@
     int nerr;
     void rb_threadptr_interrupt(rb_thread_t *th);
     void rb_threadptr_check_signal(rb_thread_t *mth);
-    long i;
-    rb_vm_t *vm = GET_VM();
-    VALUE ary = (VALUE)&vm->at_exit;
 
     rb_threadptr_interrupt(th);
     rb_threadptr_check_signal(th);
@@ -165,13 +162,6 @@
     POP_TAG();
     rb_thread_stop_timer_thread();
 
-    /* at_exit functions called here; any other place more apropriate
-     * for this purpose? let me know if any. */
-    for (i=RARRAY_LEN(ary) - 1; i>=0; i--) {
-       ((void(*)(rb_vm_t*))RARRAY_PTR(ary)[i])(vm);
-    }
-    rb_ary_free(ary);
-
 #if EXIT_SUCCESS != 0 || EXIT_FAILURE != 1
     switch (ex) {
 #if EXIT_SUCCESS != 0
Index: vm.c
===================================================================
--- vm.c	(revision 30952)
+++ vm.c	(revision 30953)
@@ -181,6 +181,19 @@
     rb_ary_push((VALUE)&GET_VM()->at_exit, (VALUE)func);
 }
 
+static void
+ruby_vm_run_at_exit_hooks(rb_vm_t *vm)
+{
+    VALUE hook = (VALUE)&vm->at_exit;
+
+    while (RARRAY_LEN(hook) > 0) {
+	typedef void rb_vm_at_exit_func(rb_vm_t*);
+	rb_vm_at_exit_func *func = (rb_vm_at_exit_func*)rb_ary_pop(hook);
+	(*func)(vm);
+    }
+    rb_ary_free(hook);
+}
+
 /* Env */
 
 /*
@@ -1550,6 +1563,7 @@
 	    rb_objspace_free(objspace);
 	}
 #endif
+	ruby_vm_run_at_exit_hooks(vm);
 	rb_vm_gvl_destroy(vm);
 	ruby_xfree(vm);
 	ruby_current_vm = 0;

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

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