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

ruby-changes:25798

From: kosaki <ko1@a...>
Date: Mon, 26 Nov 2012 18:22:11 +0900 (JST)
Subject: [ruby-changes:25798] kosaki:r37855 (trunk): split trap interrupt and async interrupt

kosaki	2012-11-26 18:22:01 +0900 (Mon, 26 Nov 2012)

  New Revision: 37855

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

  Log:
    split trap interrupt and async interrupt

  Modified files:
    trunk/thread.c
    trunk/vm_core.h

Index: vm_core.h
===================================================================
--- vm_core.h	(revision 37854)
+++ vm_core.h	(revision 37855)
@@ -860,7 +860,8 @@
 #define RUBY_VM_SET_TIMER_INTERRUPT(th)		ATOMIC_OR((th)->interrupt_flag, 0x01)
 #define RUBY_VM_SET_INTERRUPT(th)		ATOMIC_OR((th)->interrupt_flag, 0x02)
 #define RUBY_VM_SET_FINALIZER_INTERRUPT(th)	ATOMIC_OR((th)->interrupt_flag, 0x04)
-#define RUBY_VM_INTERRUPTED(th) ((th)->interrupt_flag & 0x02)
+#define RUBY_VM_SET_TRAP_INTERRUPT(th)		ATOMIC_OR((th)->interrupt_flag, 0x08)
+#define RUBY_VM_INTERRUPTED(th) ((th)->interrupt_flag & 0x0A)
 
 int rb_signal_buff_size(void);
 void rb_signal_exec(rb_thread_t *th, int sig);
Index: thread.c
===================================================================
--- thread.c	(revision 37854)
+++ thread.c	(revision 37855)
@@ -287,11 +287,14 @@
     native_mutex_unlock(&th->interrupt_lock);
 }
 
-void
-rb_threadptr_interrupt(rb_thread_t *th)
+static void
+rb_threadptr_interrupt_common(rb_thread_t *th, int trap)
 {
     native_mutex_lock(&th->interrupt_lock);
-    RUBY_VM_SET_INTERRUPT(th);
+    if (trap)
+	RUBY_VM_SET_TRAP_INTERRUPT(th);
+    else
+	RUBY_VM_SET_INTERRUPT(th);
     if (th->unblock.func) {
 	(th->unblock.func)(th->unblock.arg);
     }
@@ -301,7 +304,18 @@
     native_mutex_unlock(&th->interrupt_lock);
 }
 
+void
+rb_threadptr_interrupt(rb_thread_t *th)
+{
+    rb_threadptr_interrupt_common(th, 0);
+}
 
+void
+rb_threadptr_trap_interrupt(rb_thread_t *th)
+{
+    rb_threadptr_interrupt_common(th, 1);
+}
+
 static int
 terminate_i(st_data_t key, st_data_t val, rb_thread_t *main_thread)
 {
@@ -1718,20 +1732,22 @@
     while ((interrupt = ATOMIC_EXCHANGE(th->interrupt_flag, 0)) != 0) {
 	enum rb_thread_status status = th->status;
 	int timer_interrupt = interrupt & 0x01;
+	int async_errinfo_interrupt = interrupt & 0x02;
 	int finalizer_interrupt = interrupt & 0x04;
+	int trap_interrupt = interrupt & 0x08;
 	int sig;
 
 	th->status = THREAD_RUNNABLE;
 
 	/* signal handling */
-	if (th == th->vm->main_thread) {
+	if (trap_interrupt && (th == th->vm->main_thread)) {
 	    while ((sig = rb_get_next_signal()) != 0) {
 		rb_signal_exec(th, sig);
 	    }
 	}
 
 	/* exception from another thread */
-	if (rb_threadptr_async_errinfo_active_p(th)) {
+	if (async_errinfo_interrupt && rb_threadptr_async_errinfo_active_p(th)) {
 	    VALUE err = rb_threadptr_async_errinfo_deque(th, blocking_timing ? INTERRUPT_ON_BLOCKING : INTERRUPT_NONE);
 	    thread_debug("rb_thread_execute_interrupts: %"PRIdVALUE"\n", err);
 
@@ -3546,7 +3562,7 @@
     /* mth must be main_thread */
     if (rb_signal_buff_size() > 0) {
 	/* wakeup main thread */
-	rb_threadptr_interrupt(mth);
+	rb_threadptr_trap_interrupt(mth);
     }
 }
 

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

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