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/