ruby-changes:13240
From: nobu <ko1@a...>
Date: Fri, 18 Sep 2009 16:29:35 +0900 (JST)
Subject: [ruby-changes:13240] Ruby:r25000 (trunk): * common.mk (eval.o): needs vm.h.
nobu 2009-09-18 16:29:17 +0900 (Fri, 18 Sep 2009) New Revision: 25000 http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=25000 Log: * common.mk (eval.o): needs vm.h. * eval.c (ruby_cleanup): destruct current VM before exit. * gc.c (rb_objspace_free): free object space. * vm.c (ruby_vm_destruct): destruct and free VM struct. Modified files: trunk/ChangeLog trunk/common.mk trunk/eval.c trunk/gc.c trunk/include/ruby/vm.h trunk/vm.c trunk/vm_core.h Index: include/ruby/vm.h =================================================================== --- include/ruby/vm.h (revision 24999) +++ include/ruby/vm.h (revision 25000) @@ -19,4 +19,10 @@ * http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/branches/mvm/ */ +/* VM type declaration */ +typedef struct rb_vm_struct ruby_vm_t; + +/* core API */ +int ruby_vm_destruct(ruby_vm_t *vm); + #endif /* RUBY_VM_H */ Index: ChangeLog =================================================================== --- ChangeLog (revision 24999) +++ ChangeLog (revision 25000) @@ -1,3 +1,13 @@ +Fri Sep 18 16:29:16 2009 Nobuyoshi Nakada <nobu@r...> + + * common.mk (eval.o): needs vm.h. + + * eval.c (ruby_cleanup): destruct current VM before exit. + + * gc.c (rb_objspace_free): free object space. + + * vm.c (ruby_vm_destruct): destruct and free VM struct. + Fri Sep 18 16:15:04 2009 Nobuyoshi Nakada <nobu@r...> * compile.c (iseq_compile_each), parse.y (stmt, arg): arg_concat() Index: vm_core.h =================================================================== --- vm_core.h (revision 24999) +++ vm_core.h (revision 25000) @@ -31,6 +31,10 @@ #error "unsupported thread type" #endif +#ifndef ENABLE_VM_OBJSPACE +#define ENABLE_VM_OBJSPACE 1 +#endif + #include <setjmp.h> #include <signal.h> @@ -239,6 +243,11 @@ #define GetVMPtr(obj, ptr) \ GetCoreDataFromValue(obj, rb_vm_t, ptr) +#if defined(ENABLE_VM_OBJSPACE) && ENABLE_VM_OBJSPACE +struct rb_objspace; +void rb_objspace_free(struct rb_objspace *); +#endif + typedef struct rb_vm_struct { VALUE self; Index: common.mk =================================================================== --- common.mk (revision 24999) +++ common.mk (revision 25000) @@ -536,7 +536,7 @@ enumerator.$(OBJEXT): {$(VPATH)}enumerator.c $(RUBY_H_INCLUDES) error.$(OBJEXT): {$(VPATH)}error.c {$(VPATH)}known_errors.inc \ $(RUBY_H_INCLUDES) $(VM_CORE_H_INCLUDES) {$(VPATH)}debug.h -eval.$(OBJEXT): {$(VPATH)}eval.c {$(VPATH)}eval_intern.h \ +eval.$(OBJEXT): {$(VPATH)}eval.c {$(VPATH)}eval_intern.h {$(VPATH)}vm.h \ $(RUBY_H_INCLUDES) $(VM_CORE_H_INCLUDES) {$(VPATH)}eval_error.c \ {$(VPATH)}eval_jump.c {$(VPATH)}debug.h {$(VPATH)}gc.h {$(VPATH)}iseq.h load.$(OBJEXT): {$(VPATH)}load.c {$(VPATH)}eval_intern.h \ Index: eval.c =================================================================== --- eval.c (revision 24999) +++ eval.c (revision 25000) @@ -14,6 +14,7 @@ #include "eval_intern.h" #include "iseq.h" #include "gc.h" +#include "ruby/vm.h" #define numberof(array) (int)(sizeof(array) / sizeof((array)[0])) @@ -159,6 +160,7 @@ POP_TAG(); rb_thread_stop_timer_thread(); + state = 0; for (nerr = 0; nerr < numberof(errs); ++nerr) { VALUE err = errs[nerr]; @@ -172,12 +174,15 @@ } else if (rb_obj_is_kind_of(err, rb_eSignal)) { VALUE sig = rb_iv_get(err, "signo"); - ruby_default_signal(NUM2INT(sig)); + state = NUM2INT(sig); + break; } else if (ex == 0) { ex = 1; } } + ruby_vm_destruct(GET_VM()); + if (state) ruby_default_signal(state); #if EXIT_SUCCESS != 0 || EXIT_FAILURE != 1 switch (ex) { Index: gc.c =================================================================== --- gc.c (revision 24999) +++ gc.c (revision 25000) @@ -366,6 +366,8 @@ #define need_call_final (finalizer_table && finalizer_table->num_entries) +static void rb_objspace_call_finalizer(rb_objspace_t *objspace); + #if defined(ENABLE_VM_OBJSPACE) && ENABLE_VM_OBJSPACE rb_objspace_t * rb_objspace_alloc(void) @@ -377,6 +379,33 @@ return objspace; } + +void +rb_objspace_free(rb_objspace_t *objspace) +{ + rb_objspace_call_finalizer(objspace); + if (objspace->profile.record) { + free(objspace->profile.record); + objspace->profile.record = 0; + } + if (global_List) { + struct gc_list *list, *next; + for (list = global_List; list; list = next) { + next = list->next; + free(list); + } + } + if (heaps) { + int i; + for (i = 0; i < heaps_used; ++i) { + free(heaps[i].membase); + } + free(heaps); + heaps_used = 0; + heaps = 0; + } + free(objspace); +} #endif /* tiny heap size */ @@ -2613,7 +2642,12 @@ void rb_gc_call_finalizer_at_exit(void) { - rb_objspace_t *objspace = &rb_objspace; + rb_objspace_call_finalizer(&rb_objspace); +} + +void +rb_objspace_call_finalizer(rb_objspace_t *objspace) +{ RVALUE *p, *pend; RVALUE *final_list = 0; size_t i; Index: vm.c =================================================================== --- vm.c (revision 24999) +++ vm.c (revision 25000) @@ -25,6 +25,8 @@ #include "vm_method.c" #include "vm_eval.c" +#include <assert.h> + #define BUFSIZE 0x100 #define PROCDEBUG 0 @@ -41,6 +43,8 @@ rb_thread_t *ruby_current_thread = 0; rb_vm_t *ruby_current_vm = 0; +static void thread_free(void *ptr); + VALUE rb_insns_name_array(void); void vm_analysis_operand(int insn, int n, VALUE op); @@ -1464,21 +1468,36 @@ RUBY_MARK_LEAVE("vm"); } -static void -vm_free(void *ptr) +#define vm_free 0 + +int +ruby_vm_destruct(rb_vm_t *vm) { RUBY_FREE_ENTER("vm"); - if (ptr) { - rb_vm_t *vmobj = ptr; - - st_free_table(vmobj->living_threads); - vmobj->living_threads = 0; - /* TODO: MultiVM Instance */ - /* VM object should not be cleaned by GC */ - /* ruby_xfree(ptr); */ - /* ruby_current_vm = 0; */ + if (vm) { + rb_thread_t *th = vm->main_thread; +#if defined(ENABLE_VM_OBJSPACE) && ENABLE_VM_OBJSPACE + struct rb_objspace *objspace = vm->objspace; +#endif + rb_gc_force_recycle(vm->self); + vm->main_thread = 0; + if (th) { + thread_free(th); + } + if (vm->living_threads) { + st_free_table(vm->living_threads); + vm->living_threads = 0; + } + ruby_xfree(vm); + ruby_current_vm = 0; +#if defined(ENABLE_VM_OBJSPACE) && ENABLE_VM_OBJSPACE + if (objspace) { + rb_objspace_free(objspace); + } +#endif } RUBY_FREE_LEAVE("vm"); + return 0; } static size_t -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/