]> git.sesse.net Git - greproxy/blobdiff - reorderer.cpp
Add README and license.
[greproxy] / reorderer.cpp
index 1fe3c08275ba859dbe8f6a3307e1e356ccc2d3a8..e4cafe124416d19b1ae231fce9d201c69d72f7de 100644 (file)
@@ -15,6 +15,21 @@ Reorderer::Reorderer(Sender* sender)
        gettimeofday(&last_sent_packet, NULL);
 }
 
+void Reorderer::possibly_adjust_tv(timeval *tv)
+{
+       if (packet_buffer.empty()) {
+               return;
+       }
+
+       timeval now;
+       gettimeofday(&now, NULL);
+       timeval tdiff = subtract_timeval_saturate(
+               offset_timeval_seconds(packet_buffer.top().ts, TIMEOUT_SEC), now);
+       if (less_than(tdiff, *tv)) {
+               *tv = tdiff;
+       }
+}
+
 void Reorderer::send_packet(uint16_t proto, const string& data, int seq)
 {
        timeval now;
@@ -32,8 +47,6 @@ void Reorderer::send_packet(uint16_t proto, const string& data, int seq)
                        last_seq + 1, packet_buffer.top().seq);
                silence = true;
                last_seq = packet_buffer.top().seq - 1;
-               // TODO: Rerun immediately after we've cleared out,
-               // in case there are more timeouts.
        }
 
        // In case of restarts.
@@ -67,7 +80,7 @@ void Reorderer::send_packet(uint16_t proto, const string& data, int seq)
                //}
                const string &data = packet_buffer.top().data;
                check_ts_discontinuity(packet_buffer.top().proto, data, silence);
-               sender->send_packet(proto, data, seq);
+               sender->send_packet(packet_buffer.top().proto, data, packet_buffer.top().seq);
                packet_buffer.pop();
                last_seq = front_seq;
                last_sent_packet = now;