浏览代码

Do not uncompress from z_outbuf to outbuf unless outbuf is less than maximally full

svn:r188
Nick Mathewson 22 年之前
父节点
当前提交
4ad74c2141
共有 1 个文件被更改,包括 15 次插入7 次删除
  1. 15 7
      src/or/connection.c

+ 15 - 7
src/or/connection.c

@@ -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;
 }