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

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/

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