bool StdioCarrier::OnEvent(select_event &event) { int32_t recvAmount = 0; //3. Do the I/O switch (event.type) { case SET_READ: { IOBuffer *pInputBuffer = _pProtocol->GetInputBuffer(); assert(pInputBuffer != NULL); if (!pInputBuffer->ReadFromStdio(_inboundFd, FD_READ_CHUNK, recvAmount)) { FATAL("Unable to read data"); return false; } return _pProtocol->SignalInputData(recvAmount); } case SET_WRITE: { IOBuffer *pOutputBuffer = NULL; while ((pOutputBuffer = _pProtocol->GetOutputBuffer()) != NULL) { if (!pOutputBuffer->WriteToStdio(_outboundFd, FD_WRITE_CHUNK)) { FATAL("Unable to send data"); IOHandlerManager::EnqueueForDelete(this); return false; } if (GETAVAILABLEBYTESCOUNT(*pOutputBuffer) > 0) { ENABLE_WRITE_DATA; break; } } if (pOutputBuffer == NULL) { DISABLE_WRITE_DATA; } return true; } default: { ASSERT("Invalid state: %hhu", event.type); return false; } } }