X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=pacer.cpp;h=d049067ed8b6d04730cb11f4da468cbf2820180b;hb=0d7a8406547587b7b1adad9374b4f4985f49dd84;hp=b0683f49a9a61b8b459690ca20bf0054210b4f1c;hpb=45fc511092347489c5cb6ed76cd5fba593b93fa6;p=greproxy diff --git a/pacer.cpp b/pacer.cpp index b0683f4..d049067 100644 --- a/pacer.cpp +++ b/pacer.cpp @@ -1,4 +1,5 @@ #include "pacer.h" +#include "timeutil.h" #include @@ -11,11 +12,6 @@ Pacer::Pacer(Sender *sender, int max_rate_kbit_per_sec, int burst_num_packets) seconds_per_byte = 1.0 / max_rate_byte_per_sec; } -bool less_than(const timeval &a, const timeval &b) -{ - return make_pair(a.tv_sec, a.tv_usec) < make_pair(b.tv_sec, b.tv_usec); -} - void Pacer::send_packet(uint16_t proto, const string &data, int incoming_seq) { waiting_packets.push_back(GREPacket{incoming_seq, proto, data, {0, 0}}); @@ -30,20 +26,8 @@ void Pacer::possibly_adjust_tv(timeval *tv) timeval now; gettimeofday(&now, NULL); - if (less_than(next_send_packet, now)) { - // Should send packets immediately. - tv->tv_sec = tv->tv_usec = 0; - return; - } - - timeval tdiff; - tdiff.tv_sec = next_send_packet.tv_sec - now.tv_sec; - tdiff.tv_usec = next_send_packet.tv_usec - now.tv_usec; - if (tdiff.tv_usec < 0) { - tdiff.tv_usec += 1000000; - --tdiff.tv_sec; - } + timeval tdiff = subtract_timeval_saturate(next_send_packet, now); if (less_than(tdiff, *tv)) { *tv = tdiff; } @@ -69,14 +53,6 @@ void Pacer::possibly_flush_packets() waiting_packets.pop_front(); } - int usec_to_add = lrint(1e6 * seconds_per_byte * bytes_sent); - int sec_to_add = usec_to_add / 1000000; - usec_to_add %= 1000000; - - next_send_packet = now; - next_send_packet.tv_usec += usec_to_add; - next_send_packet.tv_sec += sec_to_add; - next_send_packet.tv_sec += next_send_packet.tv_usec / 1000000; - next_send_packet.tv_usec %= 1000000; + next_send_packet = offset_timeval_seconds(now, seconds_per_byte * bytes_sent); }