Commit 017a0fd2 authored by Vladislav Vaintroub's avatar Vladislav Vaintroub

Bug #47731 mtr freezes for many seconds when process to be killed has already gone.

The problem is that safe_kill_win fails to detect a dead process. OpenProcess() will 
succeed even after the process died, it will first fail after the last handle to process 
is closed.

To fix the problem, check process status with GetExitCodeProcess() and consider 
process to be dead if the exit code returned by this routine is not STILL_ALIVE.
parent da7b7cf6
...@@ -30,7 +30,7 @@ int main(int argc, const char** argv ) ...@@ -30,7 +30,7 @@ int main(int argc, const char** argv )
DWORD pid= -1; DWORD pid= -1;
HANDLE shutdown_event; HANDLE shutdown_event;
char safe_process_name[32]= {0}; char safe_process_name[32]= {0};
int retry_open_event= 100; int retry_open_event= 2;
/* Ignore any signals */ /* Ignore any signals */
signal(SIGINT, SIG_IGN); signal(SIGINT, SIG_IGN);
signal(SIGBREAK, SIG_IGN); signal(SIGBREAK, SIG_IGN);
...@@ -51,15 +51,31 @@ int main(int argc, const char** argv ) ...@@ -51,15 +51,31 @@ int main(int argc, const char** argv )
{ {
/* /*
Check if the process is alive, otherwise there is really Check if the process is alive, otherwise there is really
no idea to retry the open of the event no sense to retry the open of the event
*/ */
HANDLE process; HANDLE process;
if ((process= OpenProcess(SYNCHRONIZE, FALSE, pid)) == NULL) DWORD exit_code;
process= OpenProcess(SYNCHRONIZE| PROCESS_QUERY_INFORMATION, FALSE, pid);
if (!process)
{ {
fprintf(stderr, "Could not open event or process %d, error: %d\n", /* Already died */
pid, GetLastError()); exit(1);
exit(3); }
if (!GetExitCodeProcess(process,&exit_code))
{
fprintf(stderr, "GetExitCodeProcess failed, pid= %d, err= %d\n",
pid, GetLastError());
exit(1);
} }
if (exit_code != STILL_ACTIVE)
{
/* Already died */
CloseHandle(process);
exit(2);
}
CloseHandle(process); CloseHandle(process);
if (retry_open_event--) if (retry_open_event--)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment