From 56b4064686b771060090745ec791c7bee9c480a4 Mon Sep 17 00:00:00 2001 From: Keith Winstein Date: Mon, 10 Oct 2011 03:57:29 -0400 Subject: [PATCH] Fix bug that could cause desynchronization --- transportsender.cpp | 25 ++++++++----------------- 1 file changed, 8 insertions(+), 17 deletions(-) diff --git a/transportsender.cpp b/transportsender.cpp index 1d52e5d..3fb9612 100644 --- a/transportsender.cpp +++ b/transportsender.cpp @@ -1,3 +1,5 @@ +#include + #include "transportsender.hpp" #include "transportfragment.hpp" @@ -135,9 +137,8 @@ void TransportSender::add_sent_state( uint64_t the_timestamp, uint64_t sent_states.push_back( TimestampedState( the_timestamp, num, state ) ); if ( sent_states.size() > 32 ) { /* limit on state queue */ auto last = sent_states.end(); - last--; - last--; - sent_states.erase( last ); /* erase penultimate state */ + for ( int i = 0; i < 16; i++ ) { last--; } + sent_states.erase( last ); /* erase state from middle of queue */ } } @@ -264,21 +265,11 @@ void TransportSender::send_in_fragments( string diff, uint64_t new_num template void TransportSender::process_acknowledgment_through( uint64_t ack_num ) { - /* Check if state being acknowledged is one we have culled */ - assert( !sent_states.empty() ); + /* Ignore ack if we have culled the state it's acknowledging */ - if ( sent_states.back().num < ack_num ) { - return; - } - - typename list< TimestampedState >::iterator i = sent_states.begin(); - while ( i != sent_states.end() ) { - typename list< TimestampedState >::iterator inext = i; - inext++; - if ( i->num < ack_num ) { - sent_states.erase( i ); - } - i = inext; + if ( sent_states.end() != find_if( sent_states.begin(), sent_states.end(), + [ack_num]( TimestampedState x ) { return x.num == ack_num; } ) ) { + sent_states.remove_if( [ack_num]( TimestampedState x ) { return x.num < ack_num; } ); } assert( !sent_states.empty() );