[#11131] Re: SIGINT on windows — Daisuke Aoki <dai@...>

青木です。

36 messages 2000/10/04
[#11217] Re: SIGINT on windows — Daisuke Aoki <dai@...> 2000/10/14

青木です。

[#11250] Re: SIGINT on windows — Daisuke Aoki <dai@...> 2000/10/16

青木です。

[#11258] Re: SIGINT on windows — "Nobuyoshi.Nakada" <nobu.nakada@...> 2000/10/17

なかだです。

[#11298] Re: SIGINT on windows — "Nobuyoshi.Nakada" <nobu.nakada@...> 2000/10/27

なかだです。

[#11183] EPOC32 and Ruby 1.7 — WATANABE Hirofumi <eban@...>

わたなべです.

44 messages 2000/10/12
[#11188] Re: EPOC32 and Ruby 1.7 — matz@... (Yukihiro Matsumoto) 2000/10/12

まつもと ゆきひろです

[#11191] ruby-bugs-ja PR#20 — Kazuhiro NISHIYAMA <zn@...> 2000/10/12

On Fri, 13 Oct 2000 00:17:14 +0900

[#11205] Re: ruby-bugs-ja PR#20 — Kazuhiro NISHIYAMA <zn@...> 2000/10/13

同じ問題を短いスクリプトで再現できました。

[#11210] Re: Thread.new with irb (PR#20) — matz@... (Yukihiro Matsumoto) 2000/10/13

まつもと ゆきひろです

[#11211] Re: Thread.new with irb (PR#20) — Kazuhiro NISHIYAMA <zn@...> 2000/10/13

On Sat, 14 Oct 2000 03:41:18 +0900

[#11221] Re: Thread.new with irb (PR#20) — Kazuhiro NISHIYAMA <zn@...> 2000/10/14

[ruby-dev:11205]と同じスクリプトで-dをつけていると

[#11306] Ruby I18N — matz@... (Yukihiro Matsumoto)

まつもと ゆきひろです

130 messages 2000/10/28
[#11307] Re: Ruby I18N — " たけ (tk)" <ggb03124@...> 2000/10/28

たけ(tk)です。

[#11310] Re: Ruby I18N — kenn@... 2000/10/29

長沢です。

[#11314] Re: Ruby I18N — matz@... (Yukihiro Matsumoto) 2000/10/29

まつもと ゆきひろです

[#11315] Re: Ruby I18N — Shugo Maeda <shugo@...> 2000/10/30

前田です。

[#11324] Re: Ruby I18N — TAKAHASHI Masayoshi <maki@...> 2000/10/30

高橋征義です。

[#11337] Re: Ruby I18N — Yasushi Shoji <yashi@...> 2000/10/30

At Mon, 30 Oct 2000 13:15:23 +0900,

[#11346] Re: Ruby I18N — TAKAHASHI Masayoshi <maki@...> 2000/10/31

某2ちゃんねるで自分の名前を見つけてびびった高橋征義です。

[#11347] Re: Ruby I18N — matz@... (Yukihiro Matsumoto) 2000/10/31

まつもと ゆきひろです

[#11370] Re: Ruby I18N — TAKAHASHI Masayoshi <maki@...> 2000/11/02

高橋征義です。

[#11372] Re: Ruby I18N — matz@... (Yukihiro Matsumoto) 2000/11/02

まつもと ゆきひろです

[#11375] Re: Ruby I18N — TAKAHASHI Masayoshi <maki@...> 2000/11/04

高橋征義です。

[#11378] Re: Ruby I18N — " たけ (tk)" <ggb03124@...> 2000/11/05

たけ(tk)です。

[#11379] Re: Ruby I18N — matz@... (Yukihiro Matsumoto) 2000/11/05

まつもと ゆきひろです

[#11380] Re: Ruby I18N — " たけ (tk)" <ggb03124@...> 2000/11/05

たけ(tk)です。

[#11382] Re: Ruby I18N — matz@... (Yukihiro Matsumoto) 2000/11/05

まつもと ゆきひろです

[#11393] Re: Ruby I18N — "たけ(tk)" <ggb03124@...> 2000/11/07

たけ(tk)です。 ・・ 長文ご注意。

[#11396] Re: Ruby I18N — matz@... (Yukihiro Matsumoto) 2000/11/07

まつもと ゆきひろです

[#11397] Re: Ruby I18N — Yasushi Shoji <yashi@...> 2000/11/07

At Tue, 7 Nov 2000 15:46:29 +0900,

[#11398] Re: Ruby I18N — matz@... (Yukihiro Matsumoto) 2000/11/07

まつもと ゆきひろです

[#11399] Re: Ruby I18N — Tanaka Akira <akr@...17n.org> 2000/11/07

In article <E13t3dt-0002Fp-00@ev.netlab.zetabits.co.jp>,

[#11401] Re: Ruby I18N — matz@... (Yukihiro Matsumoto) 2000/11/07

まつもと ゆきひろです

[#11404] Re: Ruby I18N — "たけ(tk)" <ggb03124@...> 2000/11/07

たけ(tk)です。

[#11406] Re: Ruby I18N — Yasushi Shoji <yashi@...> 2000/11/07

At Tue, 7 Nov 2000 19:06:27 +0900,

[#11407] Re: Ruby I18N — "たけ(tk)" <ggb03124@...> 2000/11/07

たけ(tk)です。

[#11409] Re: Ruby I18N — Minero Aoki <aamine@...> 2000/11/07

あおきです。

[#11423] Re: Ruby I18N — Tanaka Akira <akr@...17n.org> 2000/11/08

In article <E13t4Hq-0002GS-00@ev.netlab.zetabits.co.jp>,

[#11426] Re: Ruby I18N — matz@... (Yukihiro Matsumoto) 2000/11/08

まつもと ゆきひろです

[#11427] Re: Ruby I18N — Tanaka Akira <akr@...17n.org> 2000/11/08

In article <E13tMYW-0002te-00@ev.netlab.zetabits.co.jp>,

[#11428] Re: Ruby I18N — matz@... (Yukihiro Matsumoto) 2000/11/08

まつもと ゆきひろです

[#11430] Re: Ruby I18N — "たけ(tk)" <ggb03124@...> 2000/11/08

たけ(tk)です。

[#11433] Re: Ruby I18N — matz@... (Yukihiro Matsumoto) 2000/11/08

まつもと ゆきひろです

[#11446] 『文字列は文字の配列か』 — " たけ (tk)" <ggb03124@...> 2000/11/08

たけ(tk)です。

[#11470] Proposal of "Array of CharCode" — " たけ (tk)" <ggb03124@...> 2000/11/10

たけ(tk)です。

[#11471] Re: Proposal of "Array of CharCode" — matz@... (Yukihiro Matsumoto) 2000/11/10

まつもと ゆきひろです

[#11450] Re: Ruby I18N — Tanaka Akira <akr@...17n.org> 2000/11/09

In article <E13tNkT-00030l-00@ev.netlab.zetabits.co.jp>,

[ruby-dev:11119] Re: SIGINT on windows

From: Daisuke Aoki <dai@...>
Date: 2000-10-03 15:13:54 UTC
List: ruby-dev #11119
青木です。

うちの環境は、PC-98、Windows 95、Visual C++ 6.0+SP5 です。
NT とか 2000 とか 98 では試していません。

nobu.nakada@nifty.ne.jp wrote:
>   となると、やっぱり signal thread で完了を待ってコンテキストを
> 戻してやらないとダメですか? でも SuspendThred() されるまでどう
> やって待とう。

安直な方法だと、
 SuspendThread(hThread); result = ResumeThread(hThread);
とやって、result が 2 以上であればサスペンドしているとわかります
ので、あとはループで検知すれば・・・
 
> > もちろん、sighandle() は呼ばれてます。
>   win32_main_context() に DebugBreak() を仕込んでみても引っかか
> らなかったんですが。

うちでは、printf() 使ってデバッグしてますが、それでちゃんと
sighandle() 2回呼ばれていることを確認してます。

>   一応目は通したものの、かなり大がかりな感じなので…。あれを持っ
> て来るなら素直に cygwin 版使えばいいじゃん、とか思ったりして。

ですね。
 
> > このあたりどう解決されるのか興味があります(^^;;
>   どう解決できるのか私も知りたいです(;_;)

ほんと興味の尽きないところなのですが(;-;)

以下、Windows 95 上での 1.6.1 の動作での詳細。

1)ReadFile() で待機。
2)Ctrl-C で sighandle() が呼ばれる。
3)win32_main_context() が呼ばれる。
4)win32_main_context() の SuspendThread() でメインスレッドが
 止まる。
5)win32_main_context() の SetThreadContext()でメインスレッドが
 動き出す。4) の SuspendThread() が無効になっている。カーネル
 モードにでもなっているのでは。ちなみに、SetThreadContext()
 した以降 SuspendThread() するコード加えても、エラーにはならないが
 止まらないので、ユーザーモードでないことしか考えられない。
6)win32_main_context() の ResumeThread() 以前にメインスレッドは
 動いてる。多分、ResumeThread()しておかないと、ユーザーモードに
 戻ったとき止まってしまうと思うが、このケースでは ResumuThread()
 が意味なくなっている。
7)win32_call_handler() が呼ばれる。
7)win32_call_handler() の handler() が呼ばれる。
8)win32_call_handler() の SetThreadContext() を呼んだ直後から、
 OS 全体の画面更新がストップする。キー操作は受け付けているので、
 ENTER キーや Ctrl-Z とかで ReadFile() から抜けることは可能。
 Ruby のプロセスが終わらない限り、画面更新のストップは続く。
 ちなみに、もう一回、Ctrl-C したりすると完全に止まる。
 Ctrl-Alt-Del で復旧は可能。

1) の ReadFile() での待機状態じゃない場合は、OS 全体の画面更新が
ストップすることはないようですが、2回目の Ctrl-C で固まったり
します。

win32_call_handler() ではなくて、win32_main_context() で
SetThreadContext() をしてみた場合は、ReadFile() 待機中でも
なんとか大丈夫にできましたが、ReadFile() 待機中じゃない場合の
Ctrl-C で、タイミング的に例外とか出たりしました。たぶん、私の
ミスが原因と思いますが不明です(^^: 以下、それに使った実験用
パッチ(1.6.1 からの差分)です。SuspendThread()で止めてないのは
上記の理由によります。

*** win32.c0	Wed Sep 27 07:36:34 2000
--- win32.c	Mon Oct 02 15:00:00 2000
***************
*** 2565,2575 ****
      SuspendThread(GetCurrentThread());
  }
  
  static void win32_call_handler(int arg, void (*handler)(int), CONTEXT
ctx)
  {
      handler(arg);
!     ctx.ContextFlags = CONTEXT_FULL | CONTEXT_FLOATING_POINT;
!     SetThreadContext(rb_MainThreadHandle, &ctx);
  }
  
  static int catch_interrupt(unsigned long msec)
--- 2565,2584 ----
      SuspendThread(GetCurrentThread());
  }
  
+ static volatile HANDLE hEvent_win32_call_hander1 = NULL;
+ static volatile HANDLE hEvent_win32_call_hander2 = NULL;
+ #if 0
  static void win32_call_handler(int arg, void (*handler)(int), CONTEXT
ctx)
+ #else
+ static void win32_call_handler(int arg, void (*handler)(int))
+ #endif
  {
      handler(arg);
! 	ResetEvent(hEvent_win32_call_hander2);
! 	SetEvent(hEvent_win32_call_hander1);
! 	WaitForSingleObject(hEvent_win32_call_hander2,INFINITE);
! //    ctx.ContextFlags = CONTEXT_FULL | CONTEXT_FLOATING_POINT;
! //    SetThreadContext(rb_MainThreadHandle, &ctx);
  }
  
  static int catch_interrupt(unsigned long msec)
***************
*** 2586,2597 ****
--- 2595,2615 ----
  
  int win32_main_context(int arg, void (*handler)(int))
  {
+ 	CONTEXT ctx_orig;
+ 
      if (!win32_thread_exclusive()) return FALSE;
  
+ #if 0
      if (!catch_interrupt(0)) {
  	SetEvent(rb_InterruptEvent);
  	return FALSE;
      }
+ #endif
+ 
+ 	if(hEvent_win32_call_hander1==NULL)
+ 		hEvent_win32_call_hander1 = CreateEvent(NULL,FALSE,FALSE,NULL);
+ 	if(hEvent_win32_call_hander2==NULL)
+ 		hEvent_win32_call_hander2 = CreateEvent(NULL,FALSE,FALSE,NULL);
  
      {
  	CONTEXT ctx;
***************
*** 2599,2608 ****
--- 2617,2631 ----
  	ZeroMemory(&ctx, sizeof(CONTEXT));
  	ctx.ContextFlags = CONTEXT_FULL | CONTEXT_FLOATING_POINT;
  	GetThreadContext(rb_MainThreadHandle, &ctx);
+ 	ctx_orig = ctx;
  #ifdef _M_IX86
  	{
+ #if 0
  	    DWORD *esp = (DWORD *)(ctx.Esp - sizeof(CONTEXT));
  	    *(CONTEXT *)esp = ctx;
+ #else
+ 	    DWORD *esp = (DWORD *)ctx.Esp;
+ #endif
  	    *--esp = (DWORD)handler;
  	    *--esp = arg;
  	    *--esp = ctx.Eip;
***************
*** 2616,2622 ****
--- 2639,2652 ----
  	ctx.ContextFlags = CONTEXT_CONTROL;
  	SetThreadContext(rb_MainThreadHandle, &ctx);
      }
+ 	ResetEvent(hEvent_win32_call_hander1);
      ResumeThread(rb_MainThreadHandle);
+ 	WaitForSingleObject(hEvent_win32_call_hander1,INFINITE);
+ #undef Sleep
+ 	Sleep(0); // 安全ではないけど。
+     ctx_orig.ContextFlags = CONTEXT_FULL | CONTEXT_FLOATING_POINT;
+     SetThreadContext(rb_MainThreadHandle, &ctx_orig);
+ 	SetEvent(hEvent_win32_call_hander2);
  
      return TRUE;
  }

Sleep(0) は他のスレッドに動作を譲る働きをしますが、Sleep() 自体が
マクロで定義されてますし(^^;

# 私としてはかなりうんざりしてて、SIGINT 関連にもう手を出すのは
# 止めようと思ってます(^^;;

--
青木大輔 <dai@y7.net>

In This Thread

Prev Next