From 6702d34651db0ebb3fa6e6f0bbab38d83ce59c66 Mon Sep 17 00:00:00 2001 From: Tatsuhiro Tsujikawa Date: Tue, 12 Jun 2012 21:56:41 +0900 Subject: [PATCH] Enable EV_READ for downstream connection. Removed Downstream::force_resume_read() calls. Added missing delete downstream in shrpx_spdy_upstream.cc. In on_stream_close_callback, delete downstream even if response state != MSG_COMPLETE. This may cause segmentaiton fault. --- examples/shrpx_downstream_connection.cc | 4 ++-- examples/shrpx_https_upstream.cc | 1 - examples/shrpx_spdy_upstream.cc | 14 ++++++++------ 3 files changed, 10 insertions(+), 9 deletions(-) diff --git a/examples/shrpx_downstream_connection.cc b/examples/shrpx_downstream_connection.cc index 84a486c9..5bdd7513 100644 --- a/examples/shrpx_downstream_connection.cc +++ b/examples/shrpx_downstream_connection.cc @@ -82,7 +82,7 @@ int DownstreamConnection::attach_downstream(Downstream *downstream) downstream->set_downstream_connection(this); downstream_ = downstream; bufferevent_setwatermark(bev_, EV_READ, 0, SHRPX_READ_WARTER_MARK); - bufferevent_disable(bev_, EV_READ); + bufferevent_enable(bev_, EV_READ); bufferevent_setcb(bev_, upstream->get_downstream_readcb(), upstream->get_downstream_writecb(), @@ -134,7 +134,7 @@ void DownstreamConnection::detach_downstream(Downstream *downstream) } downstream->set_downstream_connection(0); downstream_ = 0; - bufferevent_disable(bev_, EV_READ); + bufferevent_enable(bev_, EV_READ); bufferevent_setcb(bev_, 0, 0, idle_eventcb, this); client_handler_->pool_downstream_connection(this); } diff --git a/examples/shrpx_https_upstream.cc b/examples/shrpx_https_upstream.cc index d63d5c43..b6c8a2bf 100644 --- a/examples/shrpx_https_upstream.cc +++ b/examples/shrpx_https_upstream.cc @@ -260,7 +260,6 @@ int HttpsUpstream::on_read() delete downstream; } else { pause_read(SHRPX_MSG_BLOCK); - downstream->force_resume_read(); } } } else if(htperr == htparse_error_none) { diff --git a/examples/shrpx_spdy_upstream.cc b/examples/shrpx_spdy_upstream.cc index 613c652b..bd0ec9aa 100644 --- a/examples/shrpx_spdy_upstream.cc +++ b/examples/shrpx_spdy_upstream.cc @@ -112,11 +112,11 @@ void on_stream_close_callback } } upstream->remove_downstream(downstream); + delete downstream; } else { - // At this point, downstream read may be paused. To reclaim - // file descriptor, enable read here and catch read - // notification. And delete downstream there. - downstream->force_resume_read(); + // At this point, downstream read may be paused. + upstream->remove_downstream(downstream); + delete downstream; } } } @@ -180,7 +180,6 @@ void on_ctrl_recv_callback << downstream; } downstream->set_request_state(Downstream::MSG_COMPLETE); - downstream->force_resume_read(); } break; } @@ -221,7 +220,6 @@ void on_data_chunk_recv_callback(spdylay_session *session, << downstream; } downstream->set_request_state(Downstream::MSG_COMPLETE); - downstream->force_resume_read(); } } } @@ -301,6 +299,7 @@ int SpdyUpstream::on_write() return 0; } +// After this function call, downstream may be deleted. int SpdyUpstream::send() { int rv; @@ -357,6 +356,7 @@ void spdy_downstream_readcb(bufferevent *bev, void *ptr) dconn = 0; } upstream->send(); + // At this point, downstream may be deleted. } } // namespace @@ -418,6 +418,7 @@ void spdy_downstream_eventcb(bufferevent *bev, short events, void *ptr) upstream->error_reply(downstream, 502); downstream->set_response_state(Downstream::MSG_COMPLETE); upstream->send(); + // At this point, downstream may be deleted. } } } else if(events & (BEV_EVENT_ERROR | BEV_EVENT_TIMEOUT)) { @@ -447,6 +448,7 @@ void spdy_downstream_eventcb(bufferevent *bev, short events, void *ptr) } downstream->set_response_state(Downstream::MSG_COMPLETE); upstream->send(); + // At this point, downstream may be deleted. } } }