| 608 | } |
| 609 | |
| 610 | void 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 */ |