in src/agent/NamedPipe.cc [96:143]
NamedPipe::ServiceResult NamedPipe::IoWorker::service()
{
ServiceResult progress = ServiceResult::NoProgress;
if (m_pending) {
DWORD actual = 0;
BOOL ret = GetOverlappedResult(m_namedPipe.m_handle, &m_over, &actual, FALSE);
if (!ret) {
if (GetLastError() == ERROR_IO_INCOMPLETE) {
// There is a pending I/O.
return progress;
} else {
// Pipe error.
return ServiceResult::Error;
}
}
ResetEvent(m_event.get());
m_pending = false;
completeIo(actual);
m_currentIoSize = 0;
progress = ServiceResult::Progress;
}
DWORD nextSize = 0;
bool isRead = false;
while (shouldIssueIo(&nextSize, &isRead)) {
m_currentIoSize = nextSize;
DWORD actual = 0;
memset(&m_over, 0, sizeof(m_over));
m_over.hEvent = m_event.get();
BOOL ret = isRead
? ReadFile(m_namedPipe.m_handle, m_buffer, nextSize, &actual, &m_over)
: WriteFile(m_namedPipe.m_handle, m_buffer, nextSize, &actual, &m_over);
if (!ret) {
if (GetLastError() == ERROR_IO_PENDING) {
// There is a pending I/O.
m_pending = true;
return progress;
} else {
// Pipe error.
return ServiceResult::Error;
}
}
ResetEvent(m_event.get());
completeIo(actual);
m_currentIoSize = 0;
progress = ServiceResult::Progress;
}
return progress;
}