void Connection::readyReadHandler() { while (true) { size_t fileDescriptorsCount = 0; size_t bytesToRead = m_readBuffer.size() - m_readBufferSize; ssize_t bytesRead = readBytesFromSocket(m_socketDescriptor, m_readBuffer.data() + m_readBufferSize, bytesToRead, m_fileDescriptors.data() + m_fileDescriptorsSize, &fileDescriptorsCount); if (bytesRead < 0) { // EINTR was already handled by readBytesFromSocket. if (errno == EAGAIN || errno == EWOULDBLOCK) return; // FIXME: Handle other errors here? return; } m_readBufferSize += bytesRead; m_fileDescriptorsSize += fileDescriptorsCount; if (!bytesRead) { connectionDidClose(); return; } // Process messages from data received. while (true) { if (!processMessage()) break; } } }
void Connection::readyReadHandler() { while (true) { size_t fileDescriptorsCount = 0; size_t bytesToRead = m_readBuffer.size() - m_readBufferSize; ssize_t bytesRead = readBytesFromSocket(m_socketDescriptor, m_readBuffer.data() + m_readBufferSize, bytesToRead, m_fileDescriptors.data() + m_fileDescriptorsSize, &fileDescriptorsCount); if (bytesRead < 0) { // EINTR was already handled by readBytesFromSocket. if (errno == EAGAIN || errno == EWOULDBLOCK) return; WTFLogAlways("Error receiving IPC message on socket %d in process %d: %s", m_socketDescriptor, getpid(), strerror(errno)); connectionDidClose(); return; } m_readBufferSize += bytesRead; m_fileDescriptorsSize += fileDescriptorsCount; if (!bytesRead) { connectionDidClose(); return; } // Process messages from data received. while (true) { if (!processMessage()) break; } } }
void Connection::readEventHandler() { if (m_socket < 0) return; // Handle any previously unprocessed message. if (!messageProcessingCompleted()) { if ((m_pendingBytes -= readBytesFromSocket(m_socket, (m_readBuffer.data() + (m_currentMessageSize - m_pendingBytes)), m_pendingBytes)) > 0) return; // Message received completely. Process the message now. processCompletedMessage(); } // Prepare to read the next message. uint8_t sizeBuffer[sizeof(size_t)]; memset(sizeBuffer, 0, sizeof(size_t)); while (messageProcessingCompleted()) { if (readBytesFromSocket(m_socket, sizeBuffer, sizeof(size_t))) m_currentMessageSize = *reinterpret_cast<size_t*>(sizeBuffer); if (!m_currentMessageSize) break; if (m_readBuffer.size() < m_currentMessageSize) m_readBuffer.grow(m_currentMessageSize); m_pendingBytes = m_currentMessageSize - readBytesFromSocket(m_socket, m_readBuffer.data(), m_currentMessageSize); if (m_pendingBytes > 0) // Message partially received. break; // Message received completely. Process the message now. processCompletedMessage(); memset(sizeBuffer, 0, sizeof(size_t)); } }