From cf5f4bc5583a114e4b88947df6ba416336f9dd3a Mon Sep 17 00:00:00 2001 From: Keith Winstein Date: Tue, 16 Aug 2011 23:41:16 -0400 Subject: [PATCH] Dynamic send interval --- networktransport.cpp | 24 +++++++++++++++++++----- networktransport.hpp | 4 +++- 2 files changed, 22 insertions(+), 6 deletions(-) diff --git a/networktransport.cpp b/networktransport.cpp index 21b1352..59fdd7c 100644 --- a/networktransport.cpp +++ b/networktransport.cpp @@ -37,12 +37,25 @@ Transport::Transport( MyState &initial_state, RemoteState /* client */ } +template +unsigned int Transport::send_interval( void ) +{ + unsigned int SEND_INTERVAL = connection.timeout() / 2; + if ( SEND_INTERVAL < SEND_INTERVAL_MIN ) { + SEND_INTERVAL = SEND_INTERVAL_MIN; + } else if ( SEND_INTERVAL > SEND_INTERVAL_MAX ) { + SEND_INTERVAL = SEND_INTERVAL_MAX; + } + + return SEND_INTERVAL; +} + /* Returns the number of ms to wait until next (possible) event */ template int Transport::tick( void ) { /* Determine if a new diff or empty ack needs to be sent */ - if ( timestamp() - sent_states.back().timestamp >= int64_t( SEND_INTERVAL ) ) { + if ( timestamp() - sent_states.back().timestamp >= send_interval() ) { /* Update assumed receiver state */ update_assumed_receiver_state(); @@ -52,10 +65,10 @@ int Transport::tick( void ) /* Send diffs or ack */ send_to_receiver(); - return SEND_INTERVAL; + return send_interval(); } - int64_t wait = sent_states.back().timestamp + SEND_INTERVAL - timestamp(); + int64_t wait = sent_states.back().timestamp + send_interval() - timestamp(); if ( wait < 0 ) { wait = 0; } @@ -305,9 +318,10 @@ void Transport::send_in_fragments( string diff, uint64_t n connection.send( s, send_timestamp ); if ( verbose ) { - fprintf( stderr, "Sent [%d=>%d] frag %d, ack=%d, throwaway=%d, len=%d\n", + fprintf( stderr, "Sent [%d=>%d] frag %d, ack=%d, throwaway=%d, len=%d, frame rate=%.2f\n", (int)inst.old_num, (int)inst.new_num, (int)inst.fragment_num, - (int)inst.ack_num, (int)inst.throwaway_num, (int)inst.diff.size() ); + (int)inst.ack_num, (int)inst.throwaway_num, (int)inst.diff.size(), + 1000.0 / (double)send_interval() ); } } while ( !diff.empty() ); } diff --git a/networktransport.hpp b/networktransport.hpp index c7b1643..585306c 100644 --- a/networktransport.hpp +++ b/networktransport.hpp @@ -76,11 +76,13 @@ namespace Network { class Transport { private: - static const int SEND_INTERVAL = 50; /* ms between frames */ + static const unsigned int SEND_INTERVAL_MIN = 20; /* ms between frames */ + static const unsigned int SEND_INTERVAL_MAX = 250; /* ms between frames */ static const int ACK_INTERVAL = 1000; /* ms between empty acks */ static const int HEADER_LEN = 120; /* helper methods for tick() */ + unsigned int send_interval( void ); void update_assumed_receiver_state( void ); void rationalize_states( void ); void send_to_receiver( void );