[前][次][番号順一覧][スレッド一覧][生データ]

yarv-diff:306

From: ko1 atdot.net
Date: 22 Feb 2006 14:39:45 -0000
Subject: [yarv-diff:306] r471 - in trunk: . ext/etc ext/win32ole

Author: ko1
Date: 2006-02-22 23:39:44 +0900 (Wed, 22 Feb 2006)
New Revision: 471

Modified:
   trunk/
   trunk/ChangeLog
   trunk/common.mk
   trunk/eval.c
   trunk/eval_load.c
   trunk/eval_proc.c
   trunk/eval_thread.c
   trunk/ext/etc/etc.c
   trunk/ext/win32ole/win32ole.c
   trunk/gc.c
   trunk/ruby.h
   trunk/signal.c
   trunk/thread.c
   trunk/vm_evalbody.h
   trunk/yarvcore.c
   trunk/yarvcore.h
Log:
 r726@lermite:  ko1 | 2006-02-22 23:38:42 +0900
 	* common.mk : add rule "runruby"
 
 	* eval_thread.c : remove obsolete comment
 
 	* eval.c : remove unused functions
 
 	* signal.c : ditto
 
 	* gc.c : add rb_register_mark_object() and use it
 
 	* eval_load.c : ditto
 
 	* eval_proc.c : ditto
 
 	* ext/etc/etc.c : ditto
 
 	* ext/win32ole/win32ole.c : ditto
 
 	* ruby.h : ditto
 
 	* yarvcore.h : ditto
 
 	* thread.c : add rb_thread_run_parallel()
 
 	* yarvcore.c : change bootstrap
 



Property changes on: trunk
___________________________________________________________________
Name: svk:merge
   - 81cd9672-7512-7e48-ae48-6936450e977d:/local/yarv/trunk:724
   + 81cd9672-7512-7e48-ae48-6936450e977d:/local/yarv/trunk:726

Modified: trunk/ChangeLog
===================================================================
--- trunk/ChangeLog	2006-02-22 11:21:20 UTC (rev 470)
+++ trunk/ChangeLog	2006-02-22 14:39:44 UTC (rev 471)
@@ -4,6 +4,35 @@
 #  from Mon, 03 May 2004 01:24:19 +0900
 #
 
+2006-02-22(Wed) 23:33:47 +0900  Koichi Sasada  <ko1 atdot.net>
+
+	* common.mk : add rule "runruby"
+
+	* eval_thread.c : remove obsolete comment
+
+	* eval.c : remove unused functions
+
+	* signal.c : ditto
+
+	* gc.c : add rb_register_mark_object() and use it
+
+	* eval_load.c : ditto
+
+	* eval_proc.c : ditto
+
+	* ext/etc/etc.c : ditto
+
+	* ext/win32ole/win32ole.c : ditto
+
+	* ruby.h : ditto
+
+	* yarvcore.h : ditto
+
+	* thread.c : add rb_thread_run_parallel()
+
+	* yarvcore.c : change bootstrap
+
+
 2006-02-22(Wed) 19:27:33 +0900  Koichi Sasada  <ko1 atdot.net>
 
 	* ext/win32ole/.cvsignore : removed

Modified: trunk/common.mk
===================================================================
--- trunk/common.mk	2006-02-22 11:21:20 UTC (rev 470)
+++ trunk/common.mk	2006-02-22 14:39:44 UTC (rev 471)
@@ -433,6 +433,9 @@
 run: miniruby$(EXEEXT)
 	$(MINIRUBY) -I$(srcdir)/lib $(srcdir)/test.rb $(RUNOPT)
 
+runruby: $(RUBY)
+	./$(RUBY)  -I$(srcdir)/lib -I. $(srcdir)/rb/runruby.rb $(srcdir)/test.rb
+
 parse: miniruby$(EXEEXT)
 	$(MINIRUBY) $(srcdir)/rb/parse.rb $(srcdir)/test.rb
 
@@ -456,9 +459,11 @@
 
 run.gdb:
 	echo b debug_breakpoint > run.gdb
+	echo handle SIGINT nostop
+	echo handle SIGPIPE nostop
 	echo run               >> run.gdb
 
-gdb: miniruby$(EXEEXT)
+gdb: miniruby$(EXEEXT) run.gdb
 	gdb -x run.gdb --quiet --args $(MINIRUBY) -I$(srcdir)/lib $(srcdir)/test.rb
 
 # Intel VTune

Modified: trunk/eval.c
===================================================================
--- trunk/eval.c	2006-02-22 11:21:20 UTC (rev 470)
+++ trunk/eval.c	2006-02-22 14:39:44 UTC (rev 471)
@@ -45,6 +45,8 @@
 static VALUE rb_yield_0 _((VALUE, VALUE, VALUE, int, int));
 static VALUE rb_call(VALUE, VALUE, ID, int, const VALUE *, int);
 
+static void rb_clear_trace_func(void);
+
 typedef struct event_hook {
     rb_event_hook_func_t func;
     rb_event_t events;
@@ -63,8 +65,6 @@
 	} \
     } while (0)
 
-static VALUE trace_func = 0;
-static int tracing = 0;
 static void call_trace_func _((rb_event_t, NODE *, VALUE, ID, VALUE));
 
 
@@ -90,25 +90,6 @@
 void Init_stack _((VALUE *));
 void Init_heap _((void));
 void Init_ext _((void));
-
-#ifdef HAVE_NATIVETHREAD
-rb_nativethread_t ruby_thid;
-int
-is_ruby_native_thread()
-{
-    return NATIVETHREAD_EQUAL(ruby_thid, NATIVETHREAD_CURRENT());
-}
-
-# ifdef HAVE_NATIVETHREAD_KILL
-void
-ruby_native_thread_kill(sig)
-    int sig;
-{
-    NATIVETHREAD_KILL(ruby_thid, sig);
-}
-# endif
-#endif
-
 void Init_yarv(void);
 
 void
@@ -120,9 +101,6 @@
     if (initialized)
 	return;
     initialized = 1;
-#ifdef HAVE_NATIVETHREAD
-    ruby_thid = NATIVETHREAD_CURRENT();
-#endif
 
 #ifdef __MACOS__
     rb_origenviron = 0;
@@ -134,9 +112,6 @@
     Init_stack((void *)&state);
     Init_heap();
 
-    /* default visibility is private at toplevel */
-    // SCOPE_SET(SCOPE_PRIVATE);
-
     PUSH_TAG(PROT_NONE);
     if ((state = EXEC_TAG()) == 0) {
 	rb_call_inits();
@@ -170,8 +145,7 @@
 	ruby_process_options(argc, argv);
     }
     else {
-	trace_func = 0;
-	tracing = 0;
+	rb_clear_trace_func();
 	exit(error_handle(state));
     }
     POP_THREAD_TAG();
@@ -196,8 +170,7 @@
     signal(SIGINT, SIG_DFL);
     GET_THREAD()->errinfo = 0;
     rb_gc_call_finalizer_at_exit();
-    trace_func = 0;
-    tracing = 0;
+    rb_clear_trace_func();
 }
 
 void
@@ -534,6 +507,12 @@
     return -1;
 }
 
+static void
+rb_clear_trace_func(void)
+{
+    // TODO: fix me
+}
+
 /*
  *  call-seq:
  *     set_trace_func(proc)    => proc
@@ -579,20 +558,22 @@
 
 
 static VALUE
-set_trace_func(obj, trace)
-    VALUE obj, trace;
+set_trace_func(VALUE obj, VALUE trace)
 {
     rb_event_hook_t *hook;
 
     if (NIL_P(trace)) {
-	trace_func = 0;
+	rb_clear_trace_func();
 	rb_remove_event_hook(call_trace_func);
 	return Qnil;
     }
     if (!rb_obj_is_proc(trace)) {
 	rb_raise(rb_eTypeError, "trace_func needs to be Proc");
     }
-    trace_func = trace;
+
+    // register trace func
+    // trace_func = trace;
+
     for (hook = event_hooks; hook; hook = hook->next) {
 	if (hook->func == call_trace_func)
 	    return trace;
@@ -629,6 +610,8 @@
 static void
 call_trace_func(rb_event_t event, NODE *node, VALUE self, ID id, VALUE klass)
 {
+    // TODO: fix me
+#if 0
     int state, raised;
     NODE *node_save;
     VALUE srcfile;
@@ -641,7 +624,7 @@
     if (id == ID_ALLOCATOR)
 	return;
     if (!node && ruby_sourceline == 0)
-	return;
+      return;
 
     if (!(node_save = ruby_current_node)) {
 	node_save = NEW_BEGIN(0);
@@ -682,6 +665,7 @@
     SET_CURRENT_SOURCE();
     if (state)
 	JUMP_TAG(state);
+#endif
 }
 
 
@@ -2822,6 +2806,8 @@
 void
 Init_eval()
 {
+    GET_THREAD()->vm->mark_object_ary = rb_ary_new();
+    
     init = rb_intern("initialize");
     eqq = rb_intern("===");
     each = rb_intern("each");
@@ -2854,7 +2840,7 @@
     rb_define_method(rb_mKernel, "respond_to?", obj_respond_to, -1);
     respond_to = rb_intern("respond_to?");
     basic_respond_to = rb_method_node(rb_cObject, respond_to);
-    rb_global_variable((VALUE *)&basic_respond_to);
+    rb_register_mark_object((VALUE)basic_respond_to);
 
     rb_define_global_function("raise", rb_f_raise, -1);
     rb_define_global_function("fail", rb_f_raise, -1);
@@ -2920,7 +2906,6 @@
     rb_define_global_function("untrace_var", rb_f_untrace_var, -1);	/* in variable.c */
 
     rb_define_global_function("set_trace_func", set_trace_func, 1);
-    rb_global_variable(&trace_func);
 
     rb_define_virtual_variable("$SAFE", safe_getter, safe_setter);
 }

Modified: trunk/eval_load.c
===================================================================
--- trunk/eval_load.c	2006-02-22 11:21:20 UTC (rev 470)
+++ trunk/eval_load.c	2006-02-22 14:39:44 UTC (rev 471)
@@ -504,5 +504,5 @@
     rb_define_global_function("autoload?", rb_f_autoload_p, 1);
 
     ruby_dln_librefs = rb_ary_new();
-    rb_global_variable(&ruby_dln_librefs);
+    rb_register_mark_object(ruby_dln_librefs);
 }

Modified: trunk/eval_proc.c
===================================================================
--- trunk/eval_proc.c	2006-02-22 11:21:20 UTC (rev 470)
+++ trunk/eval_proc.c	2006-02-22 14:39:44 UTC (rev 471)
@@ -1114,12 +1114,12 @@
     rb_define_method(rb_eLocalJumpError, "reason", localjump_reason, 0);
 
     exception_error = rb_exc_new2(rb_eFatal, "exception reentered");
-    rb_global_variable(&exception_error);
+    rb_register_mark_object(exception_error);
 
     rb_eSysStackError = rb_define_class("SystemStackError", rb_eException);
     sysstack_error = rb_exc_new2(rb_eSysStackError, "stack level too deep");
     OBJ_TAINT(sysstack_error);
-    rb_global_variable(&sysstack_error);
+    rb_register_mark_object(sysstack_error);
     
     rb_define_global_function("proc", rb_block_proc, 0);
     rb_define_global_function("lambda", proc_lambda, 0);

Modified: trunk/eval_thread.c
===================================================================
--- trunk/eval_thread.c	2006-02-22 11:21:20 UTC (rev 470)
+++ trunk/eval_thread.c	2006-02-22 14:39:44 UTC (rev 471)
@@ -659,21 +659,6 @@
 {
     recursive_key = rb_intern("__recursive_key__");
     rb_eThreadError = rb_define_class("ThreadError", rb_eStandardError);
-    return;
-
-    /*
-       VALUE cThGroup;
-       rb_cThread = rb_define_class("Thread", rb_cObject);
-       rb_undef_alloc_func(rb_cThread);
-
-       rb_cCont = rb_define_class("Continuation", rb_cObject);
-       rb_undef_alloc_func(rb_cCont);
-       rb_undef_method(CLASS_OF(rb_cCont), "new");
-       rb_define_method(rb_cCont, "call", rb_cont_call, -1);
-       rb_define_method(rb_cCont, "[]", rb_cont_call, -1);
-       rb_define_global_function("callcc", rb_callcc, 0);
-
-     */
 }
 
 static VALUE

Modified: trunk/ext/etc/etc.c
===================================================================
--- trunk/ext/etc/etc.c	2006-02-22 11:21:20 UTC (rev 470)
+++ trunk/ext/etc/etc.c	2006-02-22 14:39:44 UTC (rev 471)
@@ -521,7 +521,6 @@
     rb_define_module_function(mEtc, "endgrent", etc_endgrent, 0);
     rb_define_module_function(mEtc, "getgrent", etc_getgrent, 0);
 
-    rb_global_variable(&sPasswd);
     sPasswd =  rb_struct_define("Passwd",
 				"name", "passwd", "uid", "gid",
 #ifdef HAVE_ST_PW_GECOS
@@ -548,12 +547,15 @@
 #endif
 				NULL);
 
+    rb_register_mark_object(sPasswd);
+
 #ifdef HAVE_GETGRENT
-    rb_global_variable(&sGroup);
     sGroup = rb_struct_define("Group", "name",
 #ifdef HAVE_ST_GR_PASSWD
 			      "passwd",
 #endif
 			      "gid", "mem", NULL);
+
+    rb_register_mark_object(sGroup);
 #endif
 }

Modified: trunk/ext/win32ole/win32ole.c
===================================================================
--- trunk/ext/win32ole/win32ole.c	2006-02-22 11:21:20 UTC (rev 470)
+++ trunk/ext/win32ole/win32ole.c	2006-02-22 14:39:44 UTC (rev 471)
@@ -6930,8 +6930,8 @@
 void
 Init_win32ole()
 {
-    rb_global_variable(&ary_ole_event);
     ary_ole_event = rb_ary_new();
+    rb_register_mark_object(ary_ole_event);
     id_events = rb_intern("events");
 
     com_vtbl.QueryInterface = QueryInterface;
@@ -6941,9 +6941,8 @@
     com_vtbl.GetTypeInfo = GetTypeInfo;
     com_vtbl.GetIDsOfNames = GetIDsOfNames;
     com_vtbl.Invoke = Invoke;
-    rb_global_variable(&com_hash);
     com_hash = Data_Wrap_Struct(rb_cData, rb_mark_hash, st_free_table, st_init_numtable());
-
+    rb_register_mark_object(com_hash);
     cWIN32OLE = rb_define_class("WIN32OLE", rb_cObject);
 
     rb_define_alloc_func(cWIN32OLE, fole_s_allocate);

Modified: trunk/gc.c
===================================================================
--- trunk/gc.c	2006-02-22 11:21:20 UTC (rev 470)
+++ trunk/gc.c	2006-02-22 14:39:44 UTC (rev 471)
@@ -365,6 +365,12 @@
 }
 
 void
+rb_register_mark_object(VALUE obj)
+{
+    rb_ary_push(GET_THREAD()->vm->mark_object_ary, obj);
+}
+
+void
 rb_gc_unregister_address(VALUE *addr)
 {
     struct gc_list *tmp = global_List;
@@ -1266,103 +1272,105 @@
 static int
 garbage_collect(void)
 {
-  struct gc_list *list;
-  jmp_buf save_regs_gc_mark;
-  yarv_thread_t *th = GET_THREAD();
+    struct gc_list *list;
+    jmp_buf save_regs_gc_mark;
+    yarv_thread_t *th = GET_THREAD();
 
-  if (!heaps){
-    return Qfalse;
-  }
+    if (!heaps) {
+	return Qfalse;
+    }
 
-  if (dont_gc || during_gc) {
-    if (!freelist) {
-      add_heap();
+    if (dont_gc || during_gc) {
+	if (!freelist) {
+	    add_heap();
+	}
+	return Qtrue;
     }
-    return Qtrue;
-  }
-  during_gc++;
+    during_gc++;
 
-  YARV_SET_STACK_END;
+    YARV_SET_STACK_END;
 
-  init_mark_stack();
+    init_mark_stack();
 
-  if (finalizer_table) {
-    mark_tbl(finalizer_table, 0);
-  }
+    rb_gc_mark(GET_THREAD()->vm->self);
 
-  FLUSH_REGISTER_WINDOWS;
-  /* This assumes that all registers are saved into the jmp_buf (and stack) */
-  setjmp(save_regs_gc_mark);
-  mark_locations_array((VALUE*)save_regs_gc_mark, sizeof(save_regs_gc_mark) / sizeof(VALUE *));
+    if (finalizer_table) {
+	mark_tbl(finalizer_table, 0);
+    }
 
+    FLUSH_REGISTER_WINDOWS;
+    /* This assumes that all registers are saved into the jmp_buf (and stack) */
+    setjmp(save_regs_gc_mark);
+    mark_locations_array((VALUE*)save_regs_gc_mark, sizeof(save_regs_gc_mark) / sizeof(VALUE *));
+
 #if STACK_GROW_DIRECTION < 0
-  rb_gc_mark_locations(th->machine_stack_end, th->machine_stack_start);
+    rb_gc_mark_locations(th->machine_stack_end, th->machine_stack_start);
 #elif STACK_GROW_DIRECTION > 0
-  rb_gc_mark_locations(th->machin_stack_start, th->machine_stack_end + 1);
+    rb_gc_mark_locations(th->machin_stack_start, th->machine_stack_end + 1);
 #else
-  if (th->machine_stack_end < th->machin_stack_start)
-    rb_gc_mark_locations(th->machine_stack_end, th->machin_stack_start);
-  else
-    rb_gc_mark_locations(th->machin_stack_start, th->machine_stack_end + 1);
+    if (th->machine_stack_end < th->machin_stack_start)
+      rb_gc_mark_locations(th->machine_stack_end, th->machin_stack_start);
+    else
+      rb_gc_mark_locations(th->machin_stack_start, th->machine_stack_end + 1);
 #endif
 #ifdef __ia64__
-  /* mark backing store (flushed register window on the stack) */
-  /* the basic idea from guile GC code                         */
-  {
-    ucontext_t ctx;
-    VALUE *top, *bot;
+    /* mark backing store (flushed register window on the stack) */
+    /* the basic idea from guile GC code                         */
+    {
+	ucontext_t ctx;
+	VALUE *top, *bot;
 #if defined(HAVE_UNWIND_H) && defined(HAVE__UNW_CREATECONTEXTFORSELF)
-    _Unwind_Context *unwctx = _UNW_createContextForSelf();
+	_Unwind_Context *unwctx = _UNW_createContextForSelf();
 #endif
 
-    getcontext(&ctx);
-    mark_locations_array((VALUE*)&ctx.uc_mcontext,
-                         ((size_t)(sizeof(VALUE)-1 + sizeof ctx.uc_mcontext)/sizeof(VALUE)));
+	getcontext(&ctx);
+	mark_locations_array((VALUE*)&ctx.uc_mcontext,
+			     ((size_t)(sizeof(VALUE)-1 + sizeof ctx.uc_mcontext)/sizeof(VALUE)));
 #if defined(HAVE_UNWIND_H) && defined(HAVE__UNW_CREATECONTEXTFORSELF)
-    _UNW_currentContext(unwctx);
-    bot = (VALUE*)(long)_UNW_getAR(unwctx, _UNW_AR_BSP);
-    top = (VALUE*)(long)_UNW_getAR(unwctx, _UNW_AR_BSPSTORE);
-    _UNW_destroyContext(unwctx);
+	_UNW_currentContext(unwctx);
+	bot = (VALUE*)(long)_UNW_getAR(unwctx, _UNW_AR_BSP);
+	top = (VALUE*)(long)_UNW_getAR(unwctx, _UNW_AR_BSPSTORE);
+	_UNW_destroyContext(unwctx);
 #else
-    bot = (VALUE*)__libc_ia64_register_backing_store_base;
-    top = (VALUE*)ctx.uc_mcontext.IA64_BSPSTORE;
+	bot = (VALUE*)__libc_ia64_register_backing_store_base;
+	top = (VALUE*)ctx.uc_mcontext.IA64_BSPSTORE;
 #endif
-    rb_gc_mark_locations(bot, top);
-  }
+	rb_gc_mark_locations(bot, top);
+    }
 #endif
 #if defined(__human68k__) || defined(__mc68000__)
-  rb_gc_mark_locations((VALUE*)((char*)STACK_END + 2),
-                       (VALUE*)((char*)STACK_START + 2));
+    rb_gc_mark_locations((VALUE*)((char*)STACK_END + 2),
+			 (VALUE*)((char*)STACK_START + 2));
 #endif
-  rb_gc_mark_threads();
+    rb_gc_mark_threads();
 
-  /* mark protected global variables */
-  for (list = global_List; list; list = list->next) {
-    rb_gc_mark_maybe(*list->varptr);
-  }
-  rb_mark_end_proc();
-  rb_gc_mark_global_tbl();
+    /* mark protected global variables */
+    for (list = global_List; list; list = list->next) {
+	rb_gc_mark_maybe(*list->varptr);
+    }
+    rb_mark_end_proc();
+    rb_gc_mark_global_tbl();
 
-  rb_mark_tbl(rb_class_tbl);
-  rb_gc_mark_trap_list();
+    rb_mark_tbl(rb_class_tbl);
+    rb_gc_mark_trap_list();
 
-  /* mark generic instance variables for special constants */
-  rb_mark_generic_ivar_tbl();
+    /* mark generic instance variables for special constants */
+    rb_mark_generic_ivar_tbl();
 
-  rb_gc_mark_parser();
+    rb_gc_mark_parser();
 
-  /* gc_mark objects whose marking are not completed*/
-  while (!MARK_STACK_EMPTY){
-    if (mark_stack_overflow){
-      gc_mark_all();
+    /* gc_mark objects whose marking are not completed*/
+    while (!MARK_STACK_EMPTY){
+	if (mark_stack_overflow){
+	    gc_mark_all();
+	}
+	else {
+	    gc_mark_rest();
+	}
     }
-    else {
-      gc_mark_rest();
-    }
-  }
 
-  gc_sweep();
-  return Qtrue;
+    gc_sweep();
+    return Qtrue;
 }
 
 void

Modified: trunk/ruby.h
===================================================================
--- trunk/ruby.h	2006-02-22 11:21:20 UTC (rev 470)
+++ trunk/ruby.h	2006-02-22 14:39:44 UTC (rev 471)
@@ -549,6 +549,7 @@
 void rb_define_attr(VALUE,const char*,int,int);
 
 void rb_global_variable(VALUE*);
+void rb_register_mark_object(VALUE);
 void rb_gc_register_address(VALUE*);
 void rb_gc_unregister_address(VALUE*);
 
@@ -754,14 +755,6 @@
 # define NATIVETHREAD_EQUAL(t1,t2) ((t1) == (t2))
 # define HAVE_NATIVETHREAD
 #endif
-#ifdef HAVE_NATIVETHREAD
-int is_ruby_native_thread(void);
-#else
-#define is_ruby_native_thread() (1)
-#endif
-#ifdef HAVE_NATIVETHREAD_KILL
-void ruby_native_thread_kill(int);
-#endif
 
 #if defined(__cplusplus)
 #if 0

Modified: trunk/signal.c
===================================================================
--- trunk/signal.c	2006-02-22 11:21:20 UTC (rev 470)
+++ trunk/signal.c	2006-02-22 14:39:44 UTC (rev 471)
@@ -386,28 +386,6 @@
 #endif
 #endif
 
-#if defined(HAVE_NATIVETHREAD) && defined(HAVE_NATIVETHREAD_KILL)
-static void
-sigsend_to_ruby_thread(int sig)
-{
-#ifdef HAVE_SIGPROCMASK
-    sigset_t mask, old_mask;
-#else
-    int mask, old_mask;
-#endif
-
-#ifdef HAVE_SIGPROCMASK
-    sigfillset(&mask);
-    sigprocmask(SIG_BLOCK, &mask, &old_mask);
-#else
-    mask = sigblock(~0);
-    sigsetmask(mask);
-#endif
-
-    ruby_native_thread_kill(sig);
-}
-#endif
-
 #include <node.h>
 #include "yarvcore.h"
 
@@ -436,13 +414,6 @@
 static RETSIGTYPE
 sigbus(int sig)
 {
-#if defined(HAVE_NATIVETHREAD) && defined(HAVE_NATIVETHREAD_KILL)
-    if (!is_ruby_native_thread() && !rb_trap_accept_nativethreads[sig]) {
-        sigsend_to_ruby_thread(sig);
-        return;
-    }
-#endif
-
     rb_bug("Bus Error");
 }
 #endif
@@ -452,12 +423,6 @@
 static RETSIGTYPE
 sigsegv(int sig)
 {
-#if defined(HAVE_NATIVETHREAD) && defined(HAVE_NATIVETHREAD_KILL)
-    if (!is_ruby_native_thread() && !rb_trap_accept_nativethreads[sig]) {
-        sigsend_to_ruby_thread(sig);
-        return;
-    }
-#endif
     if (segv_received) {
 	fprintf(stderr, "SEGV recieved in SEGV handler\n");
 	exit(1);

Modified: trunk/thread.c
===================================================================
--- trunk/thread.c	2006-02-22 11:21:20 UTC (rev 470)
+++ trunk/thread.c	2006-02-22 14:39:44 UTC (rev 471)
@@ -550,6 +550,21 @@
     return Qnil;
 }
 
+
+VALUE
+rb_thread_run_parallel(VALUE(*func)(yarv_thread_t *th, void *), void *data)
+{
+    VALUE val;
+    yarv_thread_t *th = GET_THREAD();
+    
+    GVL_UNLOCK_RANGE({
+	val = func(th, data);
+    });
+    
+    return val;
+}
+
+
 /*
  *  call-seq:
  *     Thread.pass   => nil

Modified: trunk/vm_evalbody.h
===================================================================
--- trunk/vm_evalbody.h	2006-02-22 11:21:20 UTC (rev 470)
+++ trunk/vm_evalbody.h	2006-02-22 14:39:44 UTC (rev 471)
@@ -83,7 +83,6 @@
 	return (VALUE)insns_address_table;
     }
 #endif
-
     reg_cfp = th->cfp;
     reg_pc = reg_cfp->pc;
 

Modified: trunk/yarvcore.c
===================================================================
--- trunk/yarvcore.c	2006-02-22 11:21:20 UTC (rev 470)
+++ trunk/yarvcore.c	2006-02-22 14:39:44 UTC (rev 471)
@@ -520,6 +520,7 @@
 	yarv_vm_t *vm = ptr;
 	st_foreach(vm->living_threads, vm_mark_each_thread_func, 0);
 	MARK_UNLESS_NULL(vm->thgroup_default);
+	MARK_UNLESS_NULL(vm->mark_object_ary);
     }
     MARK_REPORT("<- vm", 0);
 }
@@ -533,6 +534,12 @@
     return obj;
 }
 
+static void
+vm_init2(yarv_vm_t *vm)
+{
+    MEMZERO(vm, yarv_vm_t, 1);
+}
+
 static VALUE
 vm_init(VALUE self, VALUE node)
 {
@@ -540,6 +547,7 @@
     yarv_vm_t *vm;
     GetVMVal(self, vm);
     vm->self = self;
+    vm->mark_object_ary = rb_ary_new();
     return self;
 }
 
@@ -1227,11 +1235,14 @@
 	VALUE vmval = rb_class_new_instance(0, 0, cYarvVM);
 	yarv_vm_t *vm;
 	yarv_thread_t *th;
-	GetVMVal(vmval, vm);
-	theYarvVM = vm;
+	vm = theYarvVM;
 
+	xfree(RDATA(vmval)->data);
+	RDATA(vmval)->data = vm;
+	vm->self = vmval;
+
 	yarvVMArray = rb_ary_new();
-	rb_global_variable(&yarvVMArray);
+	rb_register_mark_object(yarvVMArray);
 	rb_ary_push(yarvVMArray, vm->self);
 
 	/* create main thread */
@@ -1270,7 +1281,13 @@
 Init_yarv(void)
 {
     /* initialize main thread */
+    yarv_vm_t *vm = ALLOC(yarv_vm_t);
     yarv_thread_t *th = ALLOC(yarv_thread_t);
+
+    vm_init2(vm);
+    theYarvVM = vm;
+
     th_init2(th);
+    th->vm = vm;
     yarv_set_current_running_thread_raw(th);
 }

Modified: trunk/yarvcore.h
===================================================================
--- trunk/yarvcore.h	2006-02-22 11:21:20 UTC (rev 470)
+++ trunk/yarvcore.h	2006-02-22 14:39:44 UTC (rev 471)
@@ -295,6 +295,11 @@
     int thread_abort_on_exception;
     int exit_code;
     unsigned long trace_flag;
+
+
+    /* object management */
+    VALUE mark_object_ary;
+    
 } yarv_vm_t;
 
 typedef struct {


-- 
ML: yarv-diff quickml.atdot.net
Info: http://www.atdot.net/~ko1/quickml

[前][次][番号順一覧][スレッド一覧][生データ]