// The purpose of self is to represent shared ownership during // processByteEvents. This allows the owner to release ownership of the tracker // from a callback without causing problems bool ByteEventTracker::processByteEvents(std::shared_ptr<ByteEventTracker> self, uint64_t bytesWritten, bool eorTrackingEnabled) { bool advanceEOM = false; while (!byteEvents_.empty() && (byteEvents_.front().byteOffset_ <= bytesWritten)) { ByteEvent& event = byteEvents_.front(); int64_t latency; auto txn = event.getTransaction(); switch (event.eventType_) { case ByteEvent::FIRST_HEADER_BYTE: txn->onEgressHeaderFirstByte(); break; case ByteEvent::FIRST_BYTE: txn->onEgressBodyFirstByte(); break; case ByteEvent::LAST_BYTE: txn->onEgressBodyLastByte(); addAckToLastByteEvent(txn, event, eorTrackingEnabled); advanceEOM = true; break; case ByteEvent::PING_REPLY_SENT: latency = event.getLatency(); callback_->onPingReplyLatency(latency); break; } VLOG(5) << " removing ByteEvent " << event; // explicitly remove from the list, in case delete event triggers a // callback that would absorb this ByteEventTracker. event.listHook.unlink(); delete &event; } if (eorTrackingEnabled && advanceEOM) { nextLastByteEvent_ = nullptr; for (auto& event : byteEvents_) { if (event.eventType_ == ByteEvent::LAST_BYTE) { nextLastByteEvent_ = &event; break; } } VLOG(5) << "Setting nextLastByteNo to " << (nextLastByteEvent_ ? nextLastByteEvent_->byteOffset_ : 0); } return self.use_count() == 1; }
void ByteEventTracker::processByteEvents(uint64_t bytesWritten, bool eorTrackingEnabled) { bool advanceEOM = false; while (!byteEvents_.empty() && (byteEvents_.front().byteOffset_ <= bytesWritten)) { ByteEvent& event = byteEvents_.front(); int64_t latency; auto txn = event.getTransaction(); switch (event.eventType_) { case ByteEvent::FIRST_HEADER_BYTE: txn->onEgressHeaderFirstByte(); break; case ByteEvent::FIRST_BYTE: txn->onEgressBodyFirstByte(); break; case ByteEvent::LAST_BYTE: txn->onEgressBodyLastByte(); addAckToLastByteEvent(txn, event, eorTrackingEnabled); advanceEOM = true; break; case ByteEvent::PING_REPLY_SENT: latency = event.getLatency(); callback_->onPingReplyLatency(latency); break; } VLOG(5) << " removing ByteEvent " << event; delete &event; } if (eorTrackingEnabled && advanceEOM) { nextLastByteEvent_ = nullptr; for (auto& event : byteEvents_) { if (event.eventType_ == ByteEvent::LAST_BYTE) { nextLastByteEvent_ = &event; break; } } VLOG(5) << "Setting nextLastByteNo to " << (nextLastByteEvent_ ? nextLastByteEvent_->byteOffset_ : 0); } }