[前][次][番号順一覧][スレッド一覧]

ruby-changes:20378

From: usa <ko1@a...>
Date: Thu, 7 Jul 2011 00:43:45 +0900 (JST)
Subject: [ruby-changes:20378] usa:r32426 (trunk): * win32/win32.c (kill): check the process exited or not before

usa	2011-07-07 00:43:38 +0900 (Thu, 07 Jul 2011)

  New Revision: 32426

  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=32426

  Log:
    * win32/win32.c (kill): check the process exited or not before
      teminationg it. [Bug #4943]

  Modified files:
    trunk/ChangeLog
    trunk/win32/win32.c

Index: ChangeLog
===================================================================
--- ChangeLog	(revision 32425)
+++ ChangeLog	(revision 32426)
@@ -1,3 +1,8 @@
+Thu Jul  7 00:40:16 2011  NAKAMURA Usaku  <usa@r...>
+
+	* win32/win32.c (kill): check the process exited or not before
+	  teminationg it. [Bug #4943]
+
 Wed Jul  6 23:13:19 2011  Yukihiro Matsumoto  <matz@r...>
 
 	* parse.y (opt_call_args): allow trailing comma after assoc
Index: win32/win32.c
===================================================================
--- win32/win32.c	(revision 32425)
+++ win32/win32.c	(revision 32426)
@@ -3847,7 +3847,14 @@
 
       case SIGKILL:
 	RUBY_CRITICAL({
-	    HANDLE hProc = OpenProcess(PROCESS_TERMINATE, FALSE, (DWORD)pid);
+	    HANDLE hProc;
+	    struct ChildRecord* child = FindChildSlot(pid);
+	    if (child) {
+		hProc = child->hProcess;
+	    }
+	    else {
+		hProc = OpenProcess(PROCESS_TERMINATE | PROCESS_QUERY_INFORMATION, FALSE, (DWORD)pid);
+	    }
 	    if (hProc == NULL || hProc == INVALID_HANDLE_VALUE) {
 		if (GetLastError() == ERROR_INVALID_PARAMETER) {
 		    errno = ESRCH;
@@ -3858,11 +3865,24 @@
 		ret = -1;
 	    }
 	    else {
-		if (!TerminateProcess(hProc, 0)) {
-		    errno = EPERM;
+		DWORD status;
+		if (!GetExitCodeProcess(hProc, &status)) {
+		    errno = map_errno(GetLastError());
 		    ret = -1;
 		}
-		CloseHandle(hProc);
+		else if (status == STILL_ACTIVE) {
+		    if (!TerminateProcess(hProc, 0)) {
+			errno = EPERM;
+			ret = -1;
+		    }
+		}
+		else {
+		    errno = ESRCH;
+		    ret = -1;
+		}
+		if (!child) {
+		    CloseHandle(hProc);
+		}
 	    }
 	});
 	break;
@@ -5629,6 +5649,11 @@
 		SetFileAttributesW(path, attr);
 	    }
 	}
+	else {
+	    while (GetFileAttributesW(path) != (DWORD)-1 || GetLastError() != ERROR_FILE_NOT_FOUND) {
+		Sleep(0);
+	    }
+	}
     });
     return ret;
 }

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]