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

svn:r188
This commit is contained in:
Nick Mathewson 2003-03-17 21:21:35 +00:00
parent 6deed60bb5
commit 4ad74c2141

View File

@ -147,8 +147,8 @@ connection_t *connection_new(int type) {
} else { } else {
conn->compression = conn->decompression = NULL; conn->compression = conn->decompression = NULL;
} }
conn->done_sending = conn->done_receiving = 0
#endif #endif
conn->done_sending = conn->done_receiving = 0;
return conn; 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 connection_decompress_to_buf(char *string, int len, connection_t *conn,
int flush) { 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; int n;
struct timeval now; struct timeval now;
if (write_to_buf(string, len, if (len) {
&conn->z_outbuf, &conn->z_outbuflen, &conn->z_outbuf_datalen) < 0) if (write_to_buf(string, len,
return -1; &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( n = decompress_buf_to_buf(
&conn->z_outbuf, &conn->z_outbuflen, &conn->z_outbuf_datalen, &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; return 0;
conn->timestamp_lastwritten = now.tv_sec; conn->timestamp_lastwritten = now.tv_sec;
conn->outbuf_flushlen += n;
return n; return n;
} }