MCPcopy Create free account
hub / github.com/Icinga/icinga2 / IOThreadProc

Method IOThreadProc

lib/base/process.cpp:610–1221  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

608}
609
610void Process::IOThreadProc(int tid)
611{
612#ifdef _WIN32
613 HANDLE *handles = nullptr;
614 HANDLE *fhandles = nullptr;
615#else /* _WIN32 */
616 pollfd *pfds = nullptr;
617#endif /* _WIN32 */
618 int count = 0;
619 double now;
620
621 Utility::SetThreadName("ProcessIO");
622
623 for (;;) {
624 double timeout = -1;
625
626 now = Utility::GetTime();
627
628 {
629 std::unique_lock<std::mutex> lock(l_ProcessMutex[tid]);
630
631 count = 1 + l_Processes[tid].size();
632#ifdef _WIN32
633 handles = reinterpret_cast<HANDLE *>(realloc(handles, sizeof(HANDLE) * count));
634 fhandles = reinterpret_cast<HANDLE *>(realloc(fhandles, sizeof(HANDLE) * count));
635
636 fhandles[0] = l_Events[tid];
637
638#else /* _WIN32 */
639 pfds = reinterpret_cast<pollfd *>(realloc(pfds, sizeof(pollfd) * count));
640
641 pfds[0].fd = l_EventFDs[tid][0];
642 pfds[0].events = POLLIN;
643 pfds[0].revents = 0;
644#endif /* _WIN32 */
645
646 int i = 1;
647 for (auto& kv : l_Processes[tid]) {
648 const Process::Ptr& process = kv.second;
649#ifdef _WIN32
650 handles[i] = kv.first;
651
652 if (!process->m_ReadPending) {
653 process->m_ReadPending = true;
654
655 BOOL res = ReadFile(process->m_FD, process->m_ReadBuffer, sizeof(process->m_ReadBuffer), 0, &process->m_Overlapped);
656 if (res || GetLastError() != ERROR_IO_PENDING) {
657 process->m_ReadFailed = !res;
658 SetEvent(process->m_Overlapped.hEvent);
659 }
660 }
661
662 fhandles[i] = process->m_Overlapped.hEvent;
663#else /* _WIN32 */
664 pfds[i].fd = process->m_FD;
665 pfds[i].events = POLLIN;
666 pfds[i].revents = 0;
667#endif /* _WIN32 */

Callers

nothing calls this directly

Calls 7

LogClass · 0.85
GetNextTimeoutMethod · 0.80
findMethod · 0.80
DoEventsMethod · 0.80
sizeMethod · 0.45
endMethod · 0.45
eraseMethod · 0.45

Tested by

no test coverage detected