Exemple #1
0
// 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);
  }
}