[#10793] 今度こそ (patch of the ruby-1.4.6 for NT4.0&VC4.0 on DEC Alpha.) — kou@...1609.sip.eee.yamaguchi-u.ac.jp (Koichi Okada)

岡田です。

10 messages 2000/09/01

[#10920] SIGINT on windows — "Nobuyoshi.Nakada" <nobu.nakada@...>

なかだです。

17 messages 2000/09/14
[#11077] Re: SIGINT on windows — matz@... (Yukihiro Matsumoto) 2000/09/27

まつもと ゆきひろです

[#10944] dummy DLL on Windows — "Nobuyoshi.Nakada" <nobu.nakada@...>

なかだです。

19 messages 2000/09/18
[#10955] Re: dummy DLL on Windows — WATANABE Hirofumi <eban@...> 2000/09/19

わたなべです.

[#10963] Re: dummy DLL on Windows — "Nobuyoshi.Nakada" <nobu.nakada@...> 2000/09/19

なかだです。

[#10964] Re: dummy DLL on Windows — WATANABE Hirofumi <eban@...> 2000/09/19

わたなべです.

[#10978] [PATCH] require in require — "Nobuyoshi.Nakada" <nobu.nakada@...>

なかだです。

15 messages 2000/09/20

[#10985] httphead.rb proxy version problem — Katsuyuki Komatsu <komatsu@...>

小松です.

16 messages 2000/09/20
[#10989] Re: httphead.rb proxy version problem — Minero Aoki <aamine@...> 2000/09/20

あおきです。

[ruby-dev:10796] Re: ruby-1.6.0-20000824.i586-mswin32 bug

From: "Nobuyoshi.Nakada" <nobu.nakada@...>
Date: 2000-09-01 15:02:21 UTC
List: ruby-dev #10796
なかだです。

At Wed, 30 Aug 2000 18:12:50 +0900
matz@zetabits.com (Yukihiro Matsumoto) wrote:
> |> rb_trap_immediateの場合ですね、問題なのは。
> |
> |  ということでしょう、たぶん。添付のパッチでどんなもんだろうと思ってますが。
> 
> いや、これじゃダメでしょう。というのもtrap_immediateが必要な
> 場合ってのは割込みなわけですから、割込みが別スレッドで行われ
> るシステムでは、そもそも割込み処理をリアルタイムで行えないこ
> とを意味します。入力待ちでCtl-Cを押しても止まらないシステムっ
> てのはいやでしょう?

  メインスレッドにスイッチして割り込み処理というのがどうもうまくいかない
ので、ひとまずこっちでやってみました。とりあえずこれでも割り込みはきいて
るようです。


diff -pruPX ./.excludes current/signal.c devel/signal.c
--- current/signal.c	Mon Aug  7 14:01:57 2000
+++ devel/signal.c	Fri Sep  1 23:22:31 2000
@@ -341,6 +341,14 @@ static RETSIGTYPE
 sighandle(sig)
     int sig;
 {
+#ifdef NT
+#define thread_exclusive() win32_thread_exclusive()
+#define thread_resume_main() win32_thread_resume_main()
+#else
+#define thread_exclusive() 1
+#define thread_resume_main() (void)0
+#endif
+
     if (sig >= NSIG) {
 	rb_bug("trap_handler: Bad signal %d", sig);
     }
@@ -349,7 +357,8 @@ sighandle(sig)
     ruby_signal(sig, sighandle);
 #endif
 
-    if (rb_trap_immediate) {
+    if (thread_exclusive() && rb_trap_immediate) {
+	/* critial section for rb_trap_immediate. but suspends main thread itself. */
 	rb_trap_immediate = 0;
 	signal_exec(sig);
 	rb_trap_immediate = 1;
@@ -358,6 +367,7 @@ sighandle(sig)
 	rb_trap_pending++;
 	trap_pending_list[sig]++;
     }
+    thread_resume_main();
 }
 
 #ifdef SIGBUS
diff -pruPX ./.excludes current/win32/win32.c devel/win32/win32.c
--- current/win32/win32.c	Fri Sep  1 12:31:05 2000
+++ devel/win32/win32.c	Fri Sep  1 22:32:37 2000
@@ -75,6 +75,21 @@ IsWinNT(void) {
     return (IdOS() == VER_PLATFORM_WIN32_NT);
 }
 
+/* main thread constants */
+HANDLE rb_CurrentProcessHandle;
+HANDLE rb_MainThreadHandle;
+DWORD rb_MainThreadId;
+
+HANDLE GetCurrentThreadHandle(void)
+{
+    HANDLE h;
+    HANDLE proc = rb_CurrentProcessHandle;
+
+    if (!DuplicateHandle(proc, GetCurrentThread(), proc, &h,
+			 0, FALSE, DUPLICATE_SAME_ACCESS))
+	return NULL;
+    return h;
+}
 
 /* simulate flock by locking a range on the file */
 
@@ -165,6 +180,10 @@ NtInitialize(int *argc, char ***argv) {
     WORD version;
     int ret;
 
+    rb_CurrentProcessHandle = GetCurrentProcess();
+    rb_MainThreadHandle = GetCurrentThreadHandle();
+    rb_MainThreadId = GetCurrentThreadId();
+
     //
     // subvert cmd.exe\'s feeble attempt at command line parsing
     //
@@ -1211,7 +1230,7 @@ NtMakeCmdVector (char *cmdline, char ***
 //
 
 DIR *
-opendir(const char *filename)
+opendir(char *filename)
 {
     DIR            *p;
     long            len;
@@ -2505,3 +2524,18 @@ mytimes(struct tms *tmbuf)
     }
     return 0;
 }
+
+int win32_thread_exclusive(void)
+{
+    if (GetCurrentThreadId() == rb_MainThreadId) return FALSE;
+
+    SuspendThread(rb_MainThreadHandle);
+    return TRUE;
+}
+
+void win32_thread_resume_main(void)
+{
+    if (GetCurrentThreadId() != rb_MainThreadId)
+	ResumeThread(rb_MainThreadHandle);
+}
+
diff -pruPX ./.excludes current/win32/win32.h devel/win32/win32.h
--- current/win32/win32.h	Tue Aug 15 15:22:49 2000
+++ devel/win32/win32.h	Fri Sep  1 22:16:06 2000
@@ -426,4 +426,16 @@ struct tms {
 #endif
 #define times mytimes
 
+/* thread stuff */
+/* initialized by NtInitialize() */
+HANDLE rb_CurrentProcessHandle;
+HANDLE rb_MainThreadHandle;
+DWORD rb_MainThreadId;
+
+HANDLE GetCurrentThreadHandle(void);
+int win32_main_context(int arg, void (*handler)(int));
+int win32_thread_exclusive(void);
+void win32_thread_cooperative(void);
+
+
 #endif


-- 
--- 僕の前にBugはない。
--- 僕の後ろにBugはできる。
    中田 伸悦


In This Thread