[#13087] importing forwardable — "Akinori MUSHA" <knu@...>

 石塚さんの forwardable.rb を標準添付ライブラリにするべく、

11 messages 2001/05/02

[#13169] SizedQueue#pop causes deadlock — "Okada Jun" <yun@...>

岡田です。

18 messages 2001/05/13
[#13171] Re: SizedQueue#pop causes deadlock — "Akinori MUSHA" <knu@...> 2001/05/13

At Sun, 13 May 2001 14:11:18 +0900,

[#13176] Re: SizedQueue#pop causes deadlock — matz@... (Yukihiro Matsumoto) 2001/05/13

まつもと ゆきひろです

[#13177] Re: SizedQueue#pop causes deadlock — "Akinori MUSHA" <knu@...> 2001/05/13

At Mon, 14 May 2001 00:24:45 +0900,

[#13187] Re: SizedQueue#pop causes deadlock — matz@... (Yukihiro Matsumoto) 2001/05/13

まつもと ゆきひろです

[#13202] Re: [ruby-list:29672] Re: Enumerator — "Akinori MUSHA" <knu@...>

 ruby-dev に移ります。

26 messages 2001/05/15
[#13208] Re: [ruby-list:29672] Re: Enumerator — matz@... (Yukihiro Matsumoto) 2001/05/15

まつもと ゆきひろです

[#13259] Enumerator -- Round 2 — "Akinori MUSHA" <knu@...>

 もう一度、 Enumerable/Enumerator についてみなさんのご意見を

29 messages 2001/05/20
[#13260] Re: Enumerator -- Round 2 — matz@... (Yukihiro Matsumoto) 2001/05/20

まつもと ゆきひろです

[#13265] Re: Enumerator -- Round 2 — "Akinori MUSHA" <knu@...> 2001/05/21

At Mon, 21 May 2001 06:04:32 +0900,

[#13268] Re: Enumerator -- Round 2 — Shin-ichiro HARA <sinara@...> 2001/05/21

原です。

[#13270] Re: Enumerator -- Round 2 — "Akinori MUSHA" <knu@...> 2001/05/21

At Mon, 21 May 2001 15:00:11 +0900,

[#13289] Re: Enumerator -- Round 2 — Shin-ichiro HARA <sinara@...> 2001/05/22

原です。

[#13290] Re: Enumerator -- Round 2 — "Akinori MUSHA" <knu@...> 2001/05/22

At Tue, 22 May 2001 19:02:10 +0900,

[#13291] Re: Enumerator -- Round 2 — Shin-ichiro HARA <sinara@...> 2001/05/22

原です。

[#13293] Re: Enumerator -- Round 2 — "Akinori MUSHA" <knu@...> 2001/05/22

At Tue, 22 May 2001 20:57:02 +0900,

[#13305] Re: Enumerator -- Round 2 — Shin-ichiro HARA <sinara@...> 2001/05/24

原です。

[#13322] Re: Enumerator -- Round 2 — "Akinori MUSHA" <knu@...> 2001/05/24

At Thu, 24 May 2001 15:44:14 +0900,

[#13277] ext/dbm in ruby 1.7 — Kazuhiro NISHIYAMA <zn@...>

ruby 1.7のext/dbmですが、

16 messages 2001/05/21
[#13280] Re: ext/dbm in ruby 1.7 — matz@... (Yukihiro Matsumoto) 2001/05/21

まつもと ゆきひろです

[#13292] Integer("X") rescue -1 が parse error — YASUI Kentarow <kenyasui@...>

安井です。

18 messages 2001/05/22
[#13294] Re: Integer("X") rescue -1 が parse error — matz@... (Yukihiro Matsumoto) 2001/05/22

まつもと ゆきひろです

[#13295] Re: Integer("X") rescue -1 が parse error — "Akinori MUSHA" <knu@...> 2001/05/23

At Wed, 23 May 2001 08:59:50 +0900,

[#13300] 1.6.4 preview3 (Re: Re: Integer("X") rescue -1 が parse error) — matz@... (Yukihiro Matsumoto) 2001/05/24

[#13304] Re: 1.6.4 preview3 (Re: Re: Integer("X") rescue -1 が parse error) — "Akinori MUSHA" <knu@...> 2001/05/24

At Thu, 24 May 2001 14:15:04 +0900,

[#13428] mswin32/ming32 system patch (experimental) — "U.Nakamura" <usa@...>

こんにちは、なかむら(う)です。

19 messages 2001/05/31
[#13435] Re: mswin32/ming32 system patch (experimental) — nobu.nakada@... 2001/06/01

なかだです。

[#13442] Re: mswin32/ming32 system patch (experimental) — "U.Nakamura" <usa@...> 2001/06/01

こんにちは、なかむら(う)です。

[#13446] Re: mswin32/ming32 system patch (experimental) — "U.Nakamura" <usa@...> 2001/06/02

こんにちは、なかむら(う)です。

[#13450] Re: mswin32/ming32 system patch (experimental) — nobu.nakada@... 2001/06/04

なかだです。

[ruby-dev:13428] mswin32/ming32 system patch (experimental)

From: "U.Nakamura" <usa@...>
Date: 2001-05-31 18:23:26 UTC
List: ruby-dev #13428
こんにちは、なかむら(う)です。

以前、mswin32/mingw32でのsystemの挙動を改良しようと試みて
パッチを投げたことがありましたが、つい先日Patrick Chenz氏
から似たような発想(spawnvpe()の替わりにCreateProcess()を
直接叩く)のパッチを頂きましたので、それをベースにして再度
試験的なパッチを作成してみました。

改良したつもりの点は以下の通り。
  1.現在のCVS HEADの実装だと、
      system("\"d:\\bin\\test\\test.bat\" \"this is a test\" 1")
      system("\"d:/bin/test/test.bat\" \"this is a test\" 1")
    が正しく動作しないが、今回の実装だと動作する。
    (Chenz氏による改良)
  2.現在のCVS HEADの実装だとsystemを叩くとそのコマンドが
    終了するまで全スレッドが停止するが、今回の実装だと他
    のスレッドは動きつづける。
    (私による改良)

なお、まだ手抜きの部分があるので、コードが整理されてなか
ったりしますが、それは気にしないで下さい :-P

ただ、このやり方がいいかどうかは僕自身にも自信はなくて、
[ruby-dev:12121]でなかださんがおっしゃっているように
spawnvpe()のままでrb_syswait()(か、それがダメなら今回の
ようにrb_waitpid()あたり)で待つようにするアプローチの方が
筋がいいかもしれません。

ご意見よろしくお願いします。

diff -p2ur current/process.c mytree/process.c
--- current/process.c	Tue May 22 23:34:12 2001
+++ mytree/process.c	Fri Jun  1 02:33:44 2001
@@ -228,5 +228,5 @@ static st_table *pid_tbl;
 #endif
 
-static int
+int
 rb_waitpid(pid, flags, st)
     int pid;
diff -p2ur current/win32/win32.c mytree/win32/win32.c
--- current/win32/win32.c	Sat May 12 15:43:28 2001
+++ mytree/win32/win32.c	Fri Jun  1 02:56:44 2001
@@ -790,4 +790,5 @@ char *cmd;
     }
 
+#if 0
     argv = ALLOC_N(CHARP, (strlen(cmd) / 2 + 2));
     cmd2 = ALLOC_N(char, (strlen(cmd) + 1));
@@ -839,5 +840,60 @@ char *cmd;
     free(cmd2);
     free(argv);
+
     return (int)((status & 0xff) << 8);
+#else
+    {
+	BOOL fRet;
+	LPCSTR lpApplicationName = NULL;
+	LPTSTR lpCommandLine;
+	LPTSTR lpCmd2 = NULL;
+	DWORD  dwCreationFlags;
+	STARTUPINFO aStartupInfo;
+	PROCESS_INFORMATION     aProcessInformation;
+	SECURITY_ATTRIBUTES sa;
+	int ret;
+	int rb_waitpid(int, int, int*);
+
+	sa.nLength              = sizeof (SECURITY_ATTRIBUTES);
+	sa.lpSecurityDescriptor = NULL;
+	sa.bInheritHandle       = TRUE;
+
+	memset(&aStartupInfo, 0, sizeof (STARTUPINFO));
+	memset(&aProcessInformation, 0, sizeof (PROCESS_INFORMATION));
+	aStartupInfo.cb = sizeof (STARTUPINFO);
+
+        dwCreationFlags = (NORMAL_PRIORITY_CLASS);
+
+	lpCommandLine = cmd;
+         /*
+	if (NtHasRedirection(cmd) || isInternalCmd(cmd)) {
+	    lpApplicationName = getenv("COMSPEC");
+	    lpCmd2 = ALLOC_N(char, strlen(lpApplicationName) + 1 + strlen(cmd) + sizeof (" /c "));
+	    sprintf(lpCmd2, "%s %s%s", lpApplicationName, " /c ", cmd);
+	    lpCommandLine = lpCmd2;
+	}
+        */
+	RUBY_CRITICAL({
+	    fRet = CreateProcess(lpApplicationName, lpCommandLine, &sa, &sa,
+				 sa.bInheritHandle, dwCreationFlags, NULL, NULL,
+				 &aStartupInfo, &aProcessInformation);
+	});
+	if (lpCmd2)
+	    free(lpCmd2);
+
+        if ( ! fRet ) {
+	    errno = GetLastError();
+	    rb_sys_fail("do_spawn: CreateProcess");
+	}
+
+	do {
+	    ret = rb_waitpid((int)aProcessInformation.hProcess, 0, &status);
+	} while (ret == -1 && errno == EINTR);
+	CloseHandle(aProcessInformation.hThread);
+	CloseHandle(aProcessInformation.hProcess);
+    }
+
+    return status;
+#endif //0
 }
 


それでは。

--
U.Nakamura <usa@osb.att.ne.jp>

In This Thread

Prev Next