]> git.ipfire.org Git - thirdparty/tor.git/commitdiff
Do not uncompress from z_outbuf to outbuf unless outbuf is less than maximally full
authorNick Mathewson <nickm@torproject.org>
Mon, 17 Mar 2003 21:21:35 +0000 (21:21 +0000)
committerNick Mathewson <nickm@torproject.org>
Mon, 17 Mar 2003 21:21:35 +0000 (21:21 +0000)
svn:r188

src/or/connection.c

index 23743cecdf7aed5fd5a73cfbf4391d9cf34b1329..cb02161fdf839730218dc4891ae1a07144c59af1 100644 (file)
@@ -147,8 +147,8 @@ connection_t *connection_new(int type) {
   } else {
     conn->compression = conn->decompression = NULL;
   }
-  conn->done_sending = conn->done_receiving = 0
 #endif
+  conn->done_sending = conn->done_receiving = 0;
   return conn;
 }
 
@@ -383,15 +383,22 @@ int connection_compress_from_buf(char *string, int len, connection_t *conn,
 
 int connection_decompress_to_buf(char *string, int len, connection_t *conn,
                                 int flush) {
-  /* This is not sane with respect to flow control; we want to spool out to 
-   * z_outbuf, but only decompress and write as needed.
-   */
   int n;
   struct timeval now;
 
-  if (write_to_buf(string, len, 
-          &conn->z_outbuf, &conn->z_outbuflen, &conn->z_outbuf_datalen) < 0)
-    return -1;
+  if (len) {
+    if (write_to_buf(string, len, 
+                    &conn->z_outbuf, &conn->z_outbuflen, &conn->z_outbuf_datalen) < 0)
+      return -1;
+  }
+
+  /* If we have more that 10 payloads worth of data waiting in outbuf, 
+   * don't uncompress any more; queue this data in z_outbuf.
+   *
+   * This check should may be different.
+   */
+  if (connection_outbuf_too_full(conn->outbuf))
+    return 0;
   
   n = decompress_buf_to_buf(
           &conn->z_outbuf, &conn->z_outbuflen, &conn->z_outbuf_datalen,
@@ -411,6 +418,7 @@ int connection_decompress_to_buf(char *string, int len, connection_t *conn,
     return 0;
 
   conn->timestamp_lastwritten = now.tv_sec;
+  conn->outbuf_flushlen += n;
 
   return n;
 }