void PollingBuffer::performTransimission(uint32_t event) { if (event & EPOLLOUT && m_outputData.size() != 0) { std::cout << "#Writing data" << std::endl; performWrite(); } pushMessages(); popMessages(); if (m_ballance == 0 && (event & EPOLLIN)) { std::cout << "#Reading data" << std::endl; performRead(); } }
void TargetFile::write( const Buffer *buffer, size_t numFrames, size_t frameOffset ) { CI_ASSERT_MSG( numFrames + frameOffset <= buffer->getNumFrames(), "numFrames + frameOffset out of bounds" ); performWrite( buffer, numFrames, frameOffset ); }
void TargetFile::write( const Buffer *buffer ) { performWrite( buffer, buffer->getNumFrames(), 0 ); }
void TargetFile::write( const Buffer *buffer, size_t numFrames ) { CI_ASSERT_MSG( numFrames <= buffer->getNumFrames(), "numFrames out of bounds" ); performWrite( buffer, numFrames, 0 ); }
void PipeBase::processEvents() { DWORD dwWait = WaitForMultipleObjects(getNumEvents(), m_hEventsArr, FALSE, 500); if (isStopped()) return; if (dwWait == WAIT_TIMEOUT) return; if (dwWait == WAIT_FAILED) { DWORD lErr = GetLastError(); return; } // dwWait shows which pipe completed the operation. size_t i = dwWait - WAIT_OBJECT_0; // determines which pipe if (i < 0 || i > (getNumEvents() - 1)) { printf("Index out of range.\n"); return; } PipeData* data = getData(i); DWORD cbRet = 0; #ifdef IPC_DEBUG if (fh) { fprintf(fh, "Triggered event %d\n", i); fflush(fh); } #endif //printf("Event %d, P: %d\n", i, data->fPendingIO); // Get the result if the operation was pending. if (data->fPendingIO) { BOOL fSuccess = GetOverlappedResult(data->hPipe, &data->oOverlap, &cbRet, FALSE); //printf("Pending S: %d A: %d P: %d\n", fSuccess, cbRet, data->pendingConnection); if (data->pendingConnection) { if (!fSuccess) throw gcException(ERR_PIPE, GetLastError(), gcString("Error {0}.\n", GetLastError())); data->pendingConnection = false; data->fPendingIO = FALSE; } else { DWORD err = GetLastError(); //Buffer is full. Wait for space if (err == ERROR_IO_INCOMPLETE) fSuccess = GetOverlappedResult(data->hPipe, &data->oOverlap, &cbRet, TRUE); if (!fSuccess || (cbRet == 0 && data->sender == false)) // || (cbRet != data->size && data->sender == true) { disconnectAndReconnect(i); ResetEvent(m_hEventsArr[i]); printf("Disconnect pending!\n"); return; } if (!data->sender) { data->size = cbRet; finishRead(data, getManager(i)); } } } bool res = false; // The pipe state determines which operation to do next. if (data->sender) res = performWrite(data, getManager(i)); else res = performRead(data, getManager(i)); if (res) ResetEvent(m_hEventsArr[i]); }