void TAO::DCPS::ReliableMulticast::detail::SenderLogic::receive( const TAO::DCPS::ReliableMulticast::detail::Packet& p, PacketVector& redelivered ) const { redelivered.clear(); if (p.type_ == TAO::DCPS::ReliableMulticast::detail::Packet::NACK) { for ( TAO::DCPS::ReliableMulticast::detail::Packet::id_type id = p.nack_begin_; id != p.nack_end_; ++id ) { BufferType::const_iterator iter = buffer_.find(id); if (iter != buffer_.end()) { redelivered.push_back(iter->second); } else { redelivered.push_back(TAO::DCPS::ReliableMulticast::detail::Packet( id, TAO::DCPS::ReliableMulticast::detail::Packet::DATA_NOT_AVAILABLE )); } } } }
void TAO::DCPS::ReliableMulticast::detail::SenderLogic::send( const TAO::DCPS::ReliableMulticast::detail::Packet& p, PacketVector& delivered ) { delivered.clear(); if ( p.type_ == TAO::DCPS::ReliableMulticast::detail::Packet::DATA_INTERMEDIATE || p.type_ == TAO::DCPS::ReliableMulticast::detail::Packet::DATA_END_OF_MESSAGE ) { buffer_packet(p, delivered); } }
void OpenDDS::DCPS::ReliableMulticast::detail::ReceiverLogic::receive( const Packet& p, PacketVector& nacks, PacketVector& delivered ) { delivered.clear(); // todo: validate if (!seen_last_delivered_) { if ( p.type_ == Packet::DATA_INTERMEDIATE || p.type_ == Packet::DATA_END_OF_MESSAGE ) { last_delivered_id_ = p.id_ - 1; seen_last_delivered_ = true; } else { return; } } if ( p.type_ == Packet::DATA_INTERMEDIATE || p.type_ == Packet::DATA_END_OF_MESSAGE || p.type_ == Packet::DATA_NOT_AVAILABLE ) { bool prior_nack_canceled = nacker_.cancel(p.id_); if (in_range(p.id_, 1, receiver_buffer_size_ + receiver_buffer_size_)) { if (p.id_ == last_delivered_id_ + 1) { Packet tmp_packet; deliver(delivered, p); while (get_and_remove_buffered_packet( last_delivered_id_ + 1, tmp_packet )) { deliver(delivered, tmp_packet); } } else if (!is_buffered(p)) { if ( p.type_ == Packet::DATA_INTERMEDIATE || p.type_ == Packet::DATA_END_OF_MESSAGE ) { buffer_packet(p, delivered); if (!prior_nack_canceled) { nacker_.nack_range(find_previous_received(p.id_) + 1, p.id_); } } else if (p.type_ == Packet::DATA_NOT_AVAILABLE) { handle_unreliable_operation(delivered); } } } } else if (p.type_ == Packet::HEARTBEAT) { if (!in_range(p.id_, 0 - 2 * receiver_buffer_size_, 0)) { // NACK the last packet, which will send it along and // then trigger the above NACK code... nacker_.nack_range(p.id_, p.id_ + 1); } } nacker_.get_nacks(nacks); }