]> git.sesse.net Git - greproxy/blobdiff - reorderer.cpp
Make Reorderer handle multi-timeouts.
[greproxy] / reorderer.cpp
index 3a6b6de0a8f32174508d0fcfb11856d8fbbe379d..2533aadc042064a7577e55c45a56718ad04faa6f 100644 (file)
@@ -2,24 +2,34 @@
 
 #include "reorderer.h"
 #include "protocol.h"
+#include "timeutil.h"
 
-#define PACKET_BUFFER_SIZE 100
-#define TIMEOUT_SEC 0.100
+#define PACKET_BUFFER_SIZE 1000
+#define TIMEOUT_SEC 1.000
 
 using namespace std;
 
-double tdiff(const timeval& a, const timeval& b)
-{
-       return b.tv_sec - a.tv_sec +
-               1e-6 * (b.tv_usec - a.tv_usec);
-}
-
 Reorderer::Reorderer(Sender* sender)
        : sender(sender), last_seq(-1)
 {
        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;
@@ -37,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.