e$B1J0fe(B@e$BCNG=!%6e9)Bg$G$9!%e(B
From: Yukihiro M. [email protected]
Subject: [ruby-dev:28818] ruby 1.8.5 preview1 (Re: Re: 1.8.5 release
schedule?)
Date: Sat, 24 Jun 2006 12:12:32 +0900
Message-ID: [email protected]
e$B@hDx!"CV$-$^$7$?!#e(B
ftp://ftp.ruby-lang.org/pub/ruby/1.8/ruby-1.8.5-preview1.tar.gz
preview1 e$B$ND>A0$Ke(B revert e$B$7$F$7$^$C$?e(B signal e$B$Ne(B patch
e$B$G$9$,!$e(B
e$B$b$72DG=$G$“$l$P!$e(Bpreview1 e$B$KE:IU$N%Q%C%A$r$”$F$Fe(B
e$B%F%9%H$7$F$_$F$$$?$@$1$J$$$G$7$g$&$+!)e(B
e$BLdBj$,$J$5$=$&$J$i!$:FE,MQ$r9M$($F$$$^$9!%e(B
Index: eval.c
RCS file: /var/cvs/src/ruby/eval.c,v
retrieving revision 1.616.2.175
diff -u -r1.616.2.175 eval.c
— eval.c 23 Jun 2006 21:37:08 -0000 1.616.2.175
+++ eval.c 25 Jun 2006 16:01:13 -0000
@@ -3,7 +3,7 @@
eval.e -
$Author: nagai $
- $Date: 2006/06/23 21:37:08 $
-
$Date: 2006/06/21 08:37:32 $
created at: Thu Jun 10 14:22:17 JST 1993
Copyright (C) 1993-2003 Yukihiro M.
@@ -1342,6 +1342,15 @@
is_ruby_native_thread() {
return NATIVETHREAD_EQUAL(ruby_thid, NATIVETHREAD_CURRENT());
}
-
+# ifdef HAVE_NATIVETHREAD_KILL
+void
+ruby_native_thread_kill(sig)
- int sig;
+{
- NATIVETHREAD_KILL(ruby_thid, sig);
+}
+# endif
#endif
void
Index: ruby.h
RCS file: /var/cvs/src/ruby/ruby.h,v
retrieving revision 1.97.2.16
diff -u -r1.97.2.16 ruby.h
— ruby.h 23 Jun 2006 21:37:10 -0000 1.97.2.16
+++ ruby.h 25 Jun 2006 16:01:14 -0000
@@ -696,6 +696,9 @@
define NATIVETHREAD_CURRENT() pthread_self()
define NATIVETHREAD_EQUAL(t1,t2) pthread_equal((t1),(t2))
define HAVE_NATIVETHREAD
+# define NATIVETHREAD_KILL(th,sig) pthread_kill((th),(sig))
+# define HAVE_NATIVETHREAD_KILL
#elif defined(_WIN32) || defined(_WIN32_WCE)
typedef DWORD rb_nativethread_t;
define NATIVETHREAD_CURRENT() GetCurrentThreadId()
@@ -703,10 +706,13 @@
define HAVE_NATIVETHREAD
#endif
#ifdef HAVE_NATIVETHREAD
-RUBY_EXTERN int is_ruby_native_thread();
+int is_ruby_native_thread _((void));
#else
#define is_ruby_native_thread() (1)
#endif
+#ifdef HAVE_NATIVETHREAD_KILL
+void ruby_native_thread_kill _((int));
+#endif
#if defined(__cplusplus)
#if 0
Index: signal.c
RCS file: /var/cvs/src/ruby/signal.c,v
retrieving revision 1.50.2.11
diff -u -r1.50.2.11 signal.c
— signal.c 23 Jun 2006 21:37:08 -0000 1.50.2.11
+++ signal.c 25 Jun 2006 16:01:14 -0000
@@ -3,7 +3,7 @@
signal.c -
$Author: nagai $
- $Date: 2006/06/23 21:37:08 $
-
$Date: 2006/06/21 08:37:32 $
created at: Tue Dec 20 10:13:44 JST 1994
Copyright (C) 1993-2003 Yukihiro M.
@@ -304,6 +304,7 @@
int safe;
} trap_list[NSIG];
static rb_atomic_t trap_pending_list[NSIG];
+static char rb_trap_accept_nativethreads[NSIG];
rb_atomic_t rb_trap_pending;
rb_atomic_t rb_trap_immediate;
int rb_prohibit_interrupt = 1;
@@ -335,21 +336,23 @@
{
struct sigaction sigact, old;
-
rb_trap_accept_nativethreads[signum] = 0;
-
sigact.sa_handler = handler;
sigemptyset(&sigact.sa_mask);
sigact.sa_flags = 0;
-#if defined(SA_RESTART)
+# if defined(SA_RESTART)
/* All other signals but VTALRM shall restart restartable syscall
VTALRM will cause EINTR to syscall if interrupted.
/
if (signum != SIGVTALRM) {
sigact.sa_flags |= SA_RESTART; / SVR4, 4.3+BSD */
}
-#endif
-#ifdef SA_NOCLDWAIT
+# endif
+# ifdef SA_NOCLDWAIT
if (signum == SIGCHLD && handler == SIG_IGN)
sigact.sa_flags |= SA_NOCLDWAIT;
-#endif
+# endif
sigaction(signum, &sigact, &old);
return old.sa_handler;
}
@@ -361,9 +364,46 @@
{
ruby_signal(signum, handler);
}
-#else
-#define ruby_signal(sig,handler) signal((sig),(handler))
-#endif
-
+# ifdef HAVE_NATIVETHREAD
+static sighandler_t
+ruby_nativethread_signal(signum, handler)
- int signum;
- sighandler_t handler;
+{
- sighandler_t old;
-
- old = ruby_signal(signum, handler);
- rb_trap_accept_nativethreads[signum] = 1;
- return old;
+}
-
+void
+posix_nativethread_signal(signum, handler)
- int signum;
- sighandler_t handler;
+{
- ruby_nativethread_signal(signum, handler);
+}
+# endif
-
+#else /* !POSIX_SIGNAL */
+#define ruby_signal(sig,handler) (rb_trap_accept_nativethreads[sig] =
0, signal((sig),(handler)))
+
+# ifdef HAVE_NATIVETHREAD
+static sighandler_t
+ruby_nativethread_signal(signum, handler)
- int signum;
- sighandler_t handler;
+{
- sighandler_t old;
-
- old = signal(signum, handler);
- rb_trap_accept_nativethreads[signum] = 1;
- return old;
+}
+# endif
+#endif /* POSIX_SIGNAL */
static void signal_exec _((int sig));
static void
@@ -394,11 +434,36 @@
break;
}
}
- else if (trap_list[sig].cmd == Qundef) {
- rb_thread_signal_exit();
- }
else {
rb_thread_trap_eval(trap_list[sig].cmd, sig, trap_list[sig].safe);
}
}
+#if defined(HAVE_NATIVETHREAD) && defined(HAVE_NATIVETHREAD_KILL)
+static void
+sigsend_to_ruby_thread(int sig)
+{
+# ifdef HAVE_SIGPROCMASK
- sigset_t mask, old_mask;
+# else
- int mask, old_mask;
+# endif
-
+# ifdef HAVE_SIGPROCMASK
- sigfillset(&mask);
- sigprocmask(SIG_BLOCK, &mask, &old_mask);
+# else
- mask = sigblock(~0);
- sigsetmask(mask);
+# endif
-
- ruby_native_thread_kill(sig);
+}
+#endif
-
static RETSIGTYPE sighandler _((int));
static RETSIGTYPE
sighandler(sig)
@@ -414,11 +479,22 @@
rb_bug(“trap_handler: Bad signal %d”, sig);
}
+#if defined(HAVE_NATIVETHREAD) && defined(HAVE_NATIVETHREAD_KILL)
#if !defined(BSD_SIGNAL) && !defined(POSIX_SIGNAL)
- ruby_signal(sig, sighandler);
- if (rb_trap_accept_nativethreads[sig]) {
-
ruby_nativethread_signal(sig, sighandler);
- } else {
-
ruby_signal(sig, sighandler);
- }
#endif
- if (ATOMIC_TEST(rb_trap_immediate)) {
+#if 0
+/*
-
- If you write a handler which works on any native thread,
-
- please enable this function and use it to install the handler,
-
- instead of `install_sighandler()'.
- */
+#ifdef HAVE_NATIVETHREAD
+static void
+install_nativethread_sighandler(signum, handler)
- int signum;
- sighandler_t handler;
+{
- sighandler_t old;
- int old_st;
-
- old_st = rb_trap_accept_nativethreads[signum];
- old = ruby_nativethread_signal(signum, handler);
- if (old != SIG_DFL) {
-
if (old_st) {
-
ruby_nativethread_signal(signum, old);
-
} else {
-
ruby_signal(signum, old);
-
}
- }
+}
+#endif
+#endif
-
static void
init_sigchld(sig)
int sig;