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/