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/