[#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:11131] Re: SIGINT on windows

From: Daisuke Aoki <dai@...>
Date: 2000-10-04 14:36:04 UTC
List: ruby-dev #11131
青木です。

nobu.nakada@nifty.ne.jp wrote:
>   main の方も suspend されるまで待ってないといけないじゃないで
> すか。システムコールに割り込めないとすると busy wait しかないの
> かと思ったんですが。SuspendThread() じゃなきゃいいんでしょうか。

メインはそのままサスペンドするか、ビジーウェイトするだけだと思います。
現状で、Windows 95 だと SuspendThread() が効かないので、
ビジーループする必要があり、その時は、
  while((volatile)busy_wait_flag) Sleep(0);
とかして調べれば。
 
>   [ruby-dev:11111]のようにして試したところ、printf() すると
> trap してました。なんか Sleep() するまで signal thread の方が動
> いてないような感じでした。しかし優先度最高じゃないのか?

Windows 95 だと、メインスレッドのスレッドプライオリティを
変えても、signal() で設定した Ctrl-C で呼び出される handler の
スレッドプライオリティは 0 のままです。メインスレッドのスレッド
プライオリティを思いっきり高くすると handler は呼ばれません。
シグナルを処理するスレッドは同一みたく、はじめ一回プライオリティを
変化させることで対処はできますが。

>   NT とはこのへんで違いますね。SetThreadContext() しても
> suspend 状態のままです。やはりシステムコール中に割り込むのは無
> 理があるような。ていうか、なんで一回目は SuspendThread() とか
> SetThreadContext() できるんでしょう。

Windows 95 では、1回目の SetThreadContext() は安全に?できている
ようです。ただ、SetThreadContext() した時点で、システムコール中
であるフラグがそのままで、サスペンドを識別機能が無効になったり
するのではないでしょうか。あくまで推測ですが。そのへんの知識は
ぜんぜんないのでして。

>   これは[ruby-dev:10794]と似てますが、

私がメーリングリストに入る前なのでチェックしていませんでした(^^)
よくはわかりませんが、古いコンテキストをそのまま使ってやれば
成功はしていたのでは(9x系では)。

> >       handler(arg);
> > !     ResetEvent(hEvent_win32_call_hander2);
> > !     SetEvent(hEvent_win32_call_hander1);
> > !     WaitForSingleObject(hEvent_win32_call_hander2,INFINITE);
>   ここが気になったんですが、WaitForSingleObject()は割り込んでも
> 大丈夫なんでしょうか。

なるほど。for(;;) に変えたら問題が消えました。最後に載せますが、
下記のパッチだとWindows 95 でほぼ大丈夫かなと思えるぐらいの動作に
なりました。けど、危険性は残っているかもしれません(^^;;

> > Sleep(0) は他のスレッドに動作を譲る働きをしますが、Sleep() 自体が
>   これって明文化された仕様なんですか。

優先度が同じ別のスレッドに譲るみたいです。MSDN Library とかに
NT の Win32 のHelp とかに書いてありますよね。多分、自分が優先度一番だと
無視されそうですが。

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

うーん(^^;;

以下、Windows 95 用に修正したパッチ(1.6.1からの差分)。けど、
Ctrl-C を押しっぱなしとか連射すると例外が出ます。
このパッチでは sleep 中の trap は無効です(^^;;

*** WIN32.C0	Wed Sep 27 07:36:34 2000
--- WIN32.C	Tue Oct 03 15:00:00 2000
***************
*** 1930,1936 ****
      else
  	trap.fd_count = 0;
      if (trap.fd_count < FD_SETSIZE)
! 	trap.fd_array[trap.fd_count++] = rb_InterruptEvent;
      // else unable to catch interrupt.
      if (trap_immediate)
  	TRAP_END;
--- 1930,1936 ----
      else
  	trap.fd_count = 0;
      if (trap.fd_count < FD_SETSIZE)
! 	trap.fd_array[trap.fd_count++] = (SOCKET)rb_InterruptEvent;
      // else unable to catch interrupt.
      if (trap_immediate)
  	TRAP_END;
***************
*** 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,2590 ----
      SuspendThread(GetCurrentThread());
  }
  
+ static volatile HANDLE hEvent_win32_call_hander = NULL;
+ static volatile int win32_call_handler_end = 0;
+ #if 1
  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);
! 	SetEvent(hEvent_win32_call_hander);
! 	for(win32_call_handler_end=1;;){
! #ifdef _MSC_VER
! 	// nop や wait の方がいいのかな。
! 	__asm {
! 		hlt
! 	}
! #endif
! 	}
! //    ctx.ContextFlags = CONTEXT_FULL | CONTEXT_FLOATING_POINT;
! //    SetThreadContext(rb_MainThreadHandle, &ctx);
  }
  
  static int catch_interrupt(unsigned long msec)
***************
*** 2586,2597 ****
--- 2601,2619 ----
  
  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_hander==NULL)
+ 		hEvent_win32_call_hander = CreateEvent(NULL,FALSE,FALSE,NULL);
  
      {
  	CONTEXT ctx;
***************
*** 2599,2608 ****
--- 2621,2635 ----
  	ZeroMemory(&ctx, sizeof(CONTEXT));
  	ctx.ContextFlags = CONTEXT_FULL | CONTEXT_FLOATING_POINT;
  	GetThreadContext(rb_MainThreadHandle, &ctx);
+ 	ctx_orig = ctx;
  #ifdef _M_IX86
  	{
+ #if 1
  	    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 ****
--- 2643,2667 ----
  	ctx.ContextFlags = CONTEXT_CONTROL;
  	SetThreadContext(rb_MainThreadHandle, &ctx);
      }
+ 	ResetEvent(hEvent_win32_call_hander);
+ 	win32_call_handler_end = 0;
      ResumeThread(rb_MainThreadHandle);
+ 	WaitForSingleObject(hEvent_win32_call_hander,INFINITE);
+ #undef Sleep
+ #if 0
+ 	Sleep(100);
+ #else
+ 	{
+ 		HANDLE hThread = GetCurrentThread();
+ 		int old = GetThreadPriority(hThread);
+ 		SetThreadPriority(hThread,THREAD_PRIORITY_NORMAL);
+ 		while(!(volatile int)win32_call_handler_end)
+ 			Sleep(0);
+ 		SetThreadPriority(hThread,old);
+ 	}
+ #endif
+     ctx_orig.ContextFlags = CONTEXT_FULL | CONTEXT_FLOATING_POINT;
+     SetThreadContext(rb_MainThreadHandle, &ctx_orig);
  
      return TRUE;
  }

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

In This Thread

Prev Next