*** kill.c 2009-02-03 14:28:21.753474644 -0500
--- kill.c.mod 2009-02-03 14:28:04.465829331 -0500
***************
*** 25,30 ****
--- 25,33 ----
BYTE sigData = sig;
BYTE sigRet = 0;
DWORD bytes;
+ DWORD timeout = 1000; /* in ms; forever = NMPWAIT_WAIT_FOREVER */
+ const int max_pipe_tries = 3;
+ int pipe_tries = 0;
/* we allow signal 0 here, but it will be ignored in pg_queue_signal */
if (sig >= PG_SIGNAL_COUNT || sig < 0)
***************
*** 39,45 ****
return -1;
}
snprintf(pipename, sizeof(pipename), "\\\\.\\pipe\\pgsignal_%u", pid);
! if (!CallNamedPipe(pipename, &sigData, 1, &sigRet, 1, &bytes, 1000))
{
if (GetLastError() == ERROR_FILE_NOT_FOUND)
errno = ESRCH;
--- 42,63 ----
return -1;
}
snprintf(pipename, sizeof(pipename), "\\\\.\\pipe\\pgsignal_%u", pid);
!
! /*
! * Writing data to the named pipe can fail for transient reasons.
! * Therefore, it is useful to retry if it fails. The maximum number of
! * calls to make was empirically determined from a 90-hour notification
! * stress test.
! */
! while (pipe_tries < max_pipe_tries &&
! !CallNamedPipe(pipename, &sigData, 1, &sigRet, 1, &bytes, timeout))
! {
! pipe_tries++;
! timeout = 250;
! pg_usleep(10000);
! }
!
! if (pipe_tries >= max_pipe_tries)
{
if (GetLastError() == ERROR_FILE_NOT_FOUND)
errno = ESRCH;