Add retry logic for OpenEvent to avoid problems when the
process to kill hasn't yet created the event
This commit is contained in:
parent
79bd441fd8
commit
4aced3b84d
@ -29,6 +29,7 @@ int main(int argc, const char** argv )
|
||||
DWORD pid= -1;
|
||||
HANDLE shutdown_event;
|
||||
char safe_process_name[32]= {0};
|
||||
int retry_open_event= 100;
|
||||
|
||||
if (argc != 2) {
|
||||
fprintf(stderr, "safe_kill <pid>\n");
|
||||
@ -39,14 +40,33 @@ int main(int argc, const char** argv )
|
||||
_snprintf(safe_process_name, sizeof(safe_process_name), "safe_process[%d]", pid);
|
||||
|
||||
/* Open the event to signal */
|
||||
if ((shutdown_event=
|
||||
OpenEvent(EVENT_MODIFY_STATE, FALSE, safe_process_name)) == NULL){
|
||||
while ((shutdown_event=
|
||||
OpenEvent(EVENT_MODIFY_STATE, FALSE, safe_process_name)) == NULL)
|
||||
{
|
||||
fprintf(stderr, "Failed to open shutdown_event '%s', error: %d\n",
|
||||
safe_process_name, GetLastError());
|
||||
exit(1);
|
||||
|
||||
/* Just check to see if pid exists */
|
||||
HANDLE pid_handle= OpenProcess(SYNCHRONIZE, FALSE, pid);
|
||||
if (pid_handle == NULL)
|
||||
fprintf(stderr, "Could not open process with pid %d, error: %d\n", pid);
|
||||
else
|
||||
CloseHandle(pid_handle);
|
||||
|
||||
if (retry_open_event--)
|
||||
{
|
||||
fprintf(stderr, "retrying...\n");
|
||||
Sleep(100); /* In milli seconds */
|
||||
}
|
||||
else
|
||||
{
|
||||
fprintf(stderr, "No more retries, exiting");
|
||||
exit(1);
|
||||
}
|
||||
}
|
||||
|
||||
if(SetEvent(shutdown_event) == 0) {
|
||||
if(SetEvent(shutdown_event) == 0)
|
||||
{
|
||||
fprintf(stderr, "Failed to signal shutdown_event '%s', error: %d\n",
|
||||
safe_process_name, GetLastError());
|
||||
CloseHandle(shutdown_event);
|
||||
|
Loading…
x
Reference in New Issue
Block a user