diff options
| author | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2009-07-28 06:48:20 +0000 |
|---|---|---|
| committer | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2009-07-28 06:48:20 +0000 |
| commit | 56057f9f8f480931d5bd82b6360dd15cfe03d451 (patch) | |
| tree | de683dd4d56ebabd731f8a433bcdca5673ef2311 | |
| parent | 8a44a33454ee59b2e93401b35f7dc25b86f690f2 (diff) | |
* eval.c (rb_event_all, rb_add_event_hook): merged thread-switch
events for RubyCocoa. [ruby-dev:38924]
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_8@24303 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
| -rw-r--r-- | ChangeLog | 5 | ||||
| -rw-r--r-- | eval.c | 30 | ||||
| -rw-r--r-- | node.h | 14 |
3 files changed, 48 insertions, 1 deletions
@@ -1,3 +1,8 @@ +Tue Jul 28 15:48:15 2009 Nobuyoshi Nakada <nobu@ruby-lang.org> + + * 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@ai.kyutech.ac.jp> * ext/tk/lib/extconf.rb: bug fix and ignore invalid Tcl/Tk libraries. @@ -2627,6 +2627,10 @@ rb_obj_is_proc(proc) 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 @@ rb_add_event_hook(func, events) 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 @@ rb_gc_abort_threads() } 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 @@ rb_thread_save_context(th) 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 @@ rb_thread_restore_context(th, exit) 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 @@ rb_thread_alloc(klass) 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); @@ -15,6 +15,9 @@ #if defined(__cplusplus) extern "C" { +#if 0 +} +#endif #endif enum node_type { @@ -368,12 +371,18 @@ typedef unsigned int rb_event_t; #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 @@ int rb_thread_reset_raised(rb_thread_t th); #define rb_thread_raised_clear(th) (rb_thread_raised_reset(th, RAISED_MASK)) #if defined(__cplusplus) +#if 0 +extern "C" { +#endif } /* extern "C" { */ #endif |
