#include "pacer.h"
+#include "timeutil.h"
#include <algorithm>
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)
+void Pacer::send_packet(uint16_t proto, const string &data, uint32_t incoming_seq)
{
waiting_packets.push_back(GREPacket{incoming_seq, proto, data, {0, 0}});
possibly_flush_packets();
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;
}
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);
}