summaryrefslogtreecommitdiff
path: root/bufferevent_openssl.c
diff options
context:
space:
mode:
authorNick Mathewson <nickm@torproject.org>2012-04-30 21:33:56 -0400
committerNick Mathewson <nickm@torproject.org>2012-04-30 21:33:56 -0400
commitb98624ef3503cea3dc3bb3312d10e22127fabb8b (patch)
tree1ed2f6c4b1150b082a5c2992055bb4fbb10588eb /bufferevent_openssl.c
parent5859c235de96a8781ad63371d692334b20ecff18 (diff)
parentb3887cdf3b2ca715a1e496b7dcf2ee583e236338 (diff)
downloadlibevent-b98624ef3503cea3dc3bb3312d10e22127fabb8b.tar.gz
Merge remote-tracking branch 'origin/patches-2.0'
Conflicts: bufferevent_openssl.c
Diffstat (limited to 'bufferevent_openssl.c')
-rw-r--r--bufferevent_openssl.c23
1 files changed, 20 insertions, 3 deletions
diff --git a/bufferevent_openssl.c b/bufferevent_openssl.c
index 5f989812..33f7d379 100644
--- a/bufferevent_openssl.c
+++ b/bufferevent_openssl.c
@@ -618,9 +618,6 @@ do_read(struct bufferevent_openssl *bev_ssl, int n_to_read)
evbuffer_commit_space(input, space, n_used);
if (bev_ssl->underlying)
BEV_RESET_GENERIC_READ_TIMEOUT(bev);
-
- if (evbuffer_get_length(input) >= bev->wm_read.low)
- bufferevent_run_readcb_(bev);
}
return blocked ? 0 : 1;
@@ -760,6 +757,7 @@ consider_reading(struct bufferevent_openssl *bev_ssl)
{
int r;
int n_to_read;
+ int read_data = 0;
while (bev_ssl->write_blocked_on_read) {
r = do_write(bev_ssl, WRITE_FRAME);
@@ -775,6 +773,8 @@ consider_reading(struct bufferevent_openssl *bev_ssl)
if (do_read(bev_ssl, n_to_read) <= 0)
break;
+ read_data = 1;
+
/* Read all pending data. This won't hit the network
* again, and will (most importantly) put us in a state
* where we don't need to read anything else until the
@@ -803,6 +803,15 @@ consider_reading(struct bufferevent_openssl *bev_ssl)
n_to_read = bytes_to_read(bev_ssl);
}
+ if (read_data == 1) {
+ struct bufferevent *bev = &bev_ssl->bev.bev;
+ struct evbuffer *input = bev->input;
+
+ if (evbuffer_get_length(input) >= bev->wm_read.low) {
+ bufferevent_run_readcb_(bev);
+ }
+ }
+
if (!bev_ssl->underlying) {
/* Should be redundant, but let's avoid busy-looping */
if (bev_ssl->bev.read_suspended ||
@@ -824,6 +833,14 @@ consider_writing(struct bufferevent_openssl *bev_ssl)
r = do_read(bev_ssl, 1024); /* XXXX 1024 is a hack */
if (r <= 0)
break;
+ else {
+ struct bufferevent *bev = &bev_ssl->bev.bev;
+ struct evbuffer *input = bev->input;
+
+ if (evbuffer_get_length(input) >= bev->wm_read.low) {
+ bufferevent_run_readcb_(bev);
+ }
+ }
}
if (bev_ssl->read_blocked_on_write)
return;