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

ruby-changes:12593

From: nobu <ko1@a...>
Date: Tue, 28 Jul 2009 15:48:37 +0900 (JST)
Subject: [ruby-changes:12593] Ruby:r24303 (ruby_1_8): * eval.c (rb_event_all, rb_add_event_hook): merged thread-switch

nobu	2009-07-28 15:48:20 +0900 (Tue, 28 Jul 2009)

  New Revision: 24303

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

  Log:
    * eval.c (rb_event_all, rb_add_event_hook): merged thread-switch
      events for RubyCocoa.  [ruby-dev:38924]

  Modified files:
    branches/ruby_1_8/ChangeLog
    branches/ruby_1_8/eval.c
    branches/ruby_1_8/node.h

Index: ruby_1_8/ChangeLog
===================================================================
--- ruby_1_8/ChangeLog	(revision 24302)
+++ ruby_1_8/ChangeLog	(revision 24303)
@@ -1,3 +1,8 @@
+Tue Jul 28 15:48:15 2009  Nobuyoshi Nakada  <nobu@r...>
+
+	* eval.c (rb_event_all, rb_add_event_hook): merged thread-switch
+	  events for RubyCocoa.  [ruby-dev:38924]
+
 Tue Jul 28 04:34:05 2009  Hidetoshi NAGAI  <nagai@a...>
 
 	* ext/tk/lib/extconf.rb: bug fix and ignore invalid Tcl/Tk libraries.
Index: ruby_1_8/eval.c
===================================================================
--- ruby_1_8/eval.c	(revision 24302)
+++ ruby_1_8/eval.c	(revision 24303)
@@ -2627,6 +2627,10 @@
     return Qfalse;
 }
 
+static void thread_deliver_event _((rb_event_hook_func_t,rb_event_t));
+
+const rb_event_t rb_event_all = RUBY_EVENT_ALL;
+
 void
 rb_add_event_hook(func, events)
     rb_event_hook_func_t func;
@@ -2639,6 +2643,9 @@
     hook->events = events;
     hook->next = event_hooks;
     event_hooks = hook;
+    if (events & RUBY_EVENT_THREAD_INIT) {
+	thread_deliver_event(func, RUBY_EVENT_THREAD_INIT);
+    }
 }
 
 int
@@ -10656,10 +10663,25 @@
     } END_FOREACH_FROM(main_thread, th);
 }
 
+static void
+thread_deliver_event(func, event)
+    rb_event_hook_func_t func;
+    rb_event_t event;
+{
+    rb_thread_t th;
+
+    FOREACH_THREAD(th) {
+	(*func)(event, 0, th->thread, 0, RBASIC(th->thread)->klass);
+    } END_FOREACH(th);
+}
+
 static inline void
 stack_free(th)
     rb_thread_t th;
 {
+    EXEC_EVENT_HOOK(RUBY_EVENT_THREAD_FREE, 0,
+		    th->thread, 0, RBASIC(th->thread)->klass);
+
     if (th->stk_ptr) free(th->stk_ptr);
     th->stk_ptr = 0;
 #ifdef __ia64
@@ -10719,6 +10741,9 @@
     VALUE *pos;
     size_t len;
     static VALUE tval;
+    
+    EXEC_EVENT_HOOK(RUBY_EVENT_THREAD_SAVE, th->node,
+		    th->thread, 0, RBASIC(th->thread)->klass);
 
     len = ruby_stack_length(&pos);
     th->stk_len = 0;
@@ -10958,6 +10983,8 @@
     int exit;
 {
     if (!th->stk_ptr) rb_bug("unsaved context");
+    EXEC_EVENT_HOOK(RUBY_EVENT_THREAD_RESTORE, th->node,
+		    th->thread, 0, RBASIC(th->thread)->klass);
     stack_extend(th, exit);
 }
 
@@ -12358,6 +12385,9 @@
     THREAD_ALLOC(th);
     th->thread = Data_Wrap_Struct(klass, thread_mark, thread_free, th);
 
+    EXEC_EVENT_HOOK(RUBY_EVENT_THREAD_INIT, ruby_current_node,
+		    th->thread, 0, RBASIC(th->thread)->klass);
+
     for (vars = th->dyna_vars; vars; vars = vars->next) {
 	if (FL_TEST(vars, DVAR_DONT_RECYCLE)) break;
 	FL_SET(vars, DVAR_DONT_RECYCLE);
Index: ruby_1_8/node.h
===================================================================
--- ruby_1_8/node.h	(revision 24302)
+++ ruby_1_8/node.h	(revision 24303)
@@ -15,7 +15,10 @@
 
 #if defined(__cplusplus)
 extern "C" {
+#if 0
+}
 #endif
+#endif
 
 enum node_type {
     NODE_METHOD,
@@ -368,12 +371,18 @@
 #define RUBY_EVENT_C_CALL   0x20
 #define RUBY_EVENT_C_RETURN 0x40
 #define RUBY_EVENT_RAISE    0x80
-#define RUBY_EVENT_ALL      0xff
+#define RUBY_EVENT_THREAD_INIT    0x0100
+#define RUBY_EVENT_THREAD_FREE    0x0200
+#define RUBY_EVENT_THREAD_SAVE    0x0400
+#define RUBY_EVENT_THREAD_RESTORE 0x0800
+#define RUBY_EVENT_THREAD_ALL     0x0f00
+#define RUBY_EVENT_ALL      0xfff
 
 typedef void (*rb_event_hook_func_t) _((rb_event_t,NODE*,VALUE,ID,VALUE));
 NODE *rb_copy_node_scope _((NODE *, NODE *));
 void rb_add_event_hook _((rb_event_hook_func_t,rb_event_t));
 int rb_remove_event_hook _((rb_event_hook_func_t));
+extern const rb_event_t rb_event_all;
 
 #if defined(HAVE_GETCONTEXT) && defined(HAVE_SETCONTEXT)
 #include <ucontext.h>
@@ -484,6 +493,9 @@
 #define rb_thread_raised_clear(th)    (rb_thread_raised_reset(th, RAISED_MASK))
 
 #if defined(__cplusplus)
+#if 0
+extern "C" {
+#endif
 }  /* extern "C" { */
 #endif
 

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

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