_hPipe = INVALID_HANDLE_VALUE;
::CloseHandle(_oOverlap.hEvent);
_oOverlap.hEvent = INVALID_HANDLE_VALUE;
+ memset(&_oOverlap, 0, sizeof(OVERLAPPED)); // clear the overlapped objects state
return false;
}
}
return new IpcStream(hPipe, mode);
}
-void IpcStream::DiagnosticsIpc::Close(bool isShutdown, ErrorCallback)
+void IpcStream::DiagnosticsIpc::Close(bool isShutdown, ErrorCallback callback)
{
// don't attempt cleanup on shutdown and let the OS handle it
if (isShutdown)
+ {
+ if (callback != nullptr)
+ callback("Closing without cleaning underlying handles", 100);
return;
+ }
if (_hPipe != INVALID_HANDLE_VALUE)
{
{
const BOOL fSuccessDisconnectNamedPipe = ::DisconnectNamedPipe(_hPipe);
_ASSERTE(fSuccessDisconnectNamedPipe != 0);
+ if (fSuccessDisconnectNamedPipe != 0 && callback != nullptr)
+ callback("Failed to disconnect NamedPipe", ::GetLastError());
}
const BOOL fSuccessCloseHandle = ::CloseHandle(_hPipe);
_ASSERTE(fSuccessCloseHandle != 0);
+ if (fSuccessCloseHandle != 0 && callback != nullptr)
+ callback("Failed to close pipe handle", ::GetLastError());
}
if (_oOverlap.hEvent != INVALID_HANDLE_VALUE)
{
- ::CloseHandle(_oOverlap.hEvent);
+ const BOOL fSuccessCloseEvent = ::CloseHandle(_oOverlap.hEvent);
+ _ASSERTE(fSuccessCloseEvent != 0);
+ if (fSuccessCloseEvent != 0 && callback != nullptr)
+ callback("Failed to close overlap event handle", ::GetLastError());
}
}
Close();
}
-void IpcStream::Close(ErrorCallback)
+void IpcStream::Close(ErrorCallback callback)
{
if (_hPipe != INVALID_HANDLE_VALUE)
{
{
const BOOL fSuccessDisconnectNamedPipe = ::DisconnectNamedPipe(_hPipe);
_ASSERTE(fSuccessDisconnectNamedPipe != 0);
+ if (fSuccessDisconnectNamedPipe != 0 && callback != nullptr)
+ callback("Failed to disconnect NamedPipe", ::GetLastError());
}
const BOOL fSuccessCloseHandle = ::CloseHandle(_hPipe);
_ASSERTE(fSuccessCloseHandle != 0);
+ if (fSuccessCloseHandle != 0 && callback != nullptr)
+ callback("Failed to close pipe handle", ::GetLastError());
}
if (_oOverlap.hEvent != INVALID_HANDLE_VALUE)
{
- ::CloseHandle(_oOverlap.hEvent);
+ const BOOL fSuccessCloseEvent = ::CloseHandle(_oOverlap.hEvent);
+ _ASSERTE(fSuccessCloseEvent != 0);
+ if (fSuccessCloseEvent != 0 && callback != nullptr)
+ callback("Failed to close overlapped event handle", ::GetLastError());
}
}
return -1;
}
}
+ else
+ {
+ // there's already data to be read
+ pHandles[i] = rgIpcPollHandles[i].pStream->_oOverlap.hEvent;
+ }
}
else
{