示例#1
0
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;
        }
    }
}
示例#2
0
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;
        }
    }
}
示例#3
0
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));
    }
}