void FifoReadCallback::readDataAvailable(size_t len) noexcept { try { readBuffer_.postallocate(len); // Process any pending packet headers. if (pendingHeader_.packetSize() > 0) { if (readBuffer_.chainLength() < pendingHeader_.packetSize()) { return; } feedParser(pendingHeader_, readBuffer_.split(pendingHeader_.packetSize())); pendingHeader_.setPacketSize(0); } while (readBuffer_.chainLength() >= std::max(sizeof(MessageHeader), sizeof(PacketHeader))) { if (isMessageHeader(readBuffer_)) { auto msgHeader = parseMessageHeader(readBuffer_); auto fromAddr = msgHeader.getLocalAddress(); auto toAddr = msgHeader.getPeerAddress(); if (msgHeader.direction() == MessageDirection::Received) { std::swap(fromAddr, toAddr); } parserMap_.fetch(msgHeader.msgId()).setAddresses(fromAddr, toAddr); continue; } auto packetHeader = parsePacketHeader( readBuffer_.split(sizeof(PacketHeader))->coalesce()); if (packetHeader.packetSize() > readBuffer_.chainLength()) { // Wait for more data. pendingHeader_ = std::move(packetHeader); return; } feedParser(packetHeader, readBuffer_.split(packetHeader.packetSize())); } } catch (const std::exception& ex) { CHECK(false) << "Unexpected exception: " << ex.what(); } }
void FifoReadCallback::readDataAvailable(size_t len) noexcept { try { readBuffer_.postallocate(len); // Process any pending packet headers. if (pendingHeader_) { if (readBuffer_.chainLength() < pendingHeader_->packetSize()) { return; } forwardMessage(pendingHeader_.value(), readBuffer_.split(pendingHeader_->packetSize())); pendingHeader_.clear(); } while (readBuffer_.chainLength() >= kHeaderMagicSize) { if (isMessageHeader(readBuffer_)) { if (readBuffer_.chainLength() < sizeof(MessageHeader)) { // Wait for more data return; } handleMessageHeader(parseMessageHeader(readBuffer_)); } if (readBuffer_.chainLength() < sizeof(PacketHeader)) { // Wait for more data return; } auto packetHeader = parsePacketHeader(readBuffer_); if (packetHeader.packetSize() > readBuffer_.chainLength()) { // Wait for more data. pendingHeader_.assign(std::move(packetHeader)); return; } forwardMessage(packetHeader, readBuffer_.split(packetHeader.packetSize())); } } catch (const std::exception& ex) { CHECK(false) << "Unexpected exception: " << ex.what(); } }