]> git.sesse.net Git - greproxy/blobdiff - pacer.cpp
Moved time functions into a shared file.
[greproxy] / pacer.cpp
index b0683f49a9a61b8b459690ca20bf0054210b4f1c..d049067ed8b6d04730cb11f4da468cbf2820180b 100644 (file)
--- a/pacer.cpp
+++ b/pacer.cpp
@@ -1,4 +1,5 @@
 #include "pacer.h"
+#include "timeutil.h"
 
 #include <algorithm>
 
@@ -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);
 }