diff --git a/examples/shrpx_downstream_connection.cc b/examples/shrpx_downstream_connection.cc index 84a486c..5bdd751 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 d63d5c4..b6c8a2b 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 613c652..bd0ec9a 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. } } }