diff --git a/src/network/networktransport.cc b/src/network/networktransport.cc index 8cdadc6..3cef6d1 100644 --- a/src/network/networktransport.cc +++ b/src/network/networktransport.cc @@ -117,8 +117,8 @@ void Transport::recv( void ) } } if ( verbose ) { - fprintf( stderr, "[%u] Received state %d [ack %d]\n", - (unsigned int)(timestamp() % 100000), (int)new_state.num, (int)inst.ack_num() ); + fprintf( stderr, "[%u] Received state %d [coming from %d, ack %d]\n", + (unsigned int)(timestamp() % 100000), (int)new_state.num, (int)inst.old_num(), (int)inst.ack_num() ); } received_states.push_back( new_state ); sender.set_ack_num( received_states.back().num ); diff --git a/src/network/transportsender.cc b/src/network/transportsender.cc index a9c7227..9da8f50 100644 --- a/src/network/transportsender.cc +++ b/src/network/transportsender.cc @@ -150,6 +150,8 @@ void TransportSender::tick( void ) string diff = current_state.diff_from( assumed_receiver_state->state ); + attempt_prospective_resend_optimization( diff ); + /* verify diff has round-trip identity (modulo Unicode fallback rendering) */ /* MyState newstate( assumed_receiver_state->state ); @@ -349,3 +351,26 @@ void TransportSender::set_ack_num( uint64_t s_ack_num ) { ack_num = s_ack_num; } + +/* Investigate diff against known receiver state instead */ +/* Mutates proposed_diff */ +template +void TransportSender::attempt_prospective_resend_optimization( string &proposed_diff ) +{ + if ( assumed_receiver_state == sent_states.begin() ) { + return; + } + + string resend_diff = current_state.diff_from( sent_states.front().state ); + + /* We do a prophylactic resend if it would make the diff shorter, + or if it would lengthen it by no more than 100 bytes and still be + less than 1000 bytes. */ + + if ( (resend_diff.size() <= proposed_diff.size()) + || ( (resend_diff.size() < 1000) + && (resend_diff.size() - proposed_diff.size() < 100) ) ) { + assumed_receiver_state = sent_states.begin(); + proposed_diff = resend_diff; + } +} diff --git a/src/network/transportsender.h b/src/network/transportsender.h index e650770..f32e67c 100644 --- a/src/network/transportsender.h +++ b/src/network/transportsender.h @@ -48,6 +48,7 @@ namespace Network { /* helper methods for tick() */ void update_assumed_receiver_state( void ); + void attempt_prospective_resend_optimization( string &proposed_diff ); void rationalize_states( void ); void send_to_receiver( string diff ); void send_empty_ack( void );