summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authornobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2009-07-28 06:48:20 +0000
committernobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2009-07-28 06:48:20 +0000
commit56057f9f8f480931d5bd82b6360dd15cfe03d451 (patch)
treede683dd4d56ebabd731f8a433bcdca5673ef2311
parent8a44a33454ee59b2e93401b35f7dc25b86f690f2 (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--ChangeLog5
-rw-r--r--eval.c30
-rw-r--r--node.h14
3 files changed, 48 insertions, 1 deletions
diff --git a/ChangeLog b/ChangeLog
index 08654b5ab8..2c4ff43cb7 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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.
diff --git a/eval.c b/eval.c
index ab8356b3f2..36d12d5058 100644
--- a/eval.c
+++ b/eval.c
@@ -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);
diff --git a/node.h b/node.h
index 3161af1190..4af13233bc 100644
--- a/node.h
+++ b/node.h
@@ -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