#34 实现HTTP解析层的Suspend/Resume操作

This commit is contained in:
Lu Qiuwen
2018-10-11 10:41:27 +08:00
committed by zhengchao
parent adb469395c
commit b8342e5358
9 changed files with 132 additions and 29 deletions

View File

@@ -89,7 +89,6 @@ void tfe_stream_detach(const struct tfe_stream * stream)
struct tfe_stream_private * _stream = to_stream_private(stream);
int plug_id = _stream->calling_idx;
_stream->plugin_ctxs[plug_id].state = PLUG_STATE_DETACHED;
return;
}
int tfe_stream_preempt(const struct tfe_stream * stream)
@@ -107,6 +106,33 @@ int tfe_stream_preempt(const struct tfe_stream * stream)
return 0;
}
void tfe_stream_suspend(const struct tfe_stream * stream)
{
struct tfe_stream_private * _stream = to_stream_private(stream);
assert(_stream != NULL);
assert(_stream->conn_upstream != NULL && _stream->conn_downstream != NULL);
assert(_stream->conn_upstream->bev != NULL);
assert(_stream->conn_downstream->bev != NULL);
/* stream cannot be suspended twice or more */
assert(!_stream->is_suspended);
_stream->is_suspended = true;
/* disable all events */
bufferevent_disable(_stream->conn_upstream->bev, EV_READ | EV_WRITE);
bufferevent_disable(_stream->conn_downstream->bev, EV_READ | EV_WRITE);
}
void tfe_stream_resume(const struct tfe_stream * stream)
{
struct tfe_stream_private * _stream = to_stream_private(stream);
assert(_stream->is_suspended);
_stream->is_suspended = false;
bufferevent_enable(_stream->conn_upstream->bev, EV_READ | EV_WRITE);
bufferevent_enable(_stream->conn_downstream->bev, EV_READ | EV_WRITE);
}
struct tfe_stream_write_ctx * tfe_stream_write_frag_start(const struct tfe_stream * stream, enum tfe_conn_dir dir)
{
struct tfe_stream_private * _stream = to_stream_private(stream);
@@ -136,7 +162,6 @@ void tfe_stream_write_frag_end(struct tfe_stream_write_ctx * w_ctx)
struct tfe_conn_private * peer_conn = __peer_conn(w_ctx->_stream, w_ctx->dir);
this_conn->on_writing = 0;
bufferevent_enable(peer_conn->bev, EV_READ);
return;
}
int tfe_stream_write(const struct tfe_stream * stream, enum tfe_conn_dir dir, const unsigned char * data, size_t size)
@@ -894,7 +919,8 @@ int tfe_stream_init_by_fds(struct tfe_stream * stream, evutil_socket_t fd_downst
if (unlikely(_stream->head.addr == NULL))
{
TFE_LOG_ERROR(_stream->stream_logger, "Failed to create address from fd %d, %d, terminate fds.",
fd_downstream, fd_upstream); goto __errout;
fd_downstream, fd_upstream);
goto __errout;
}
_stream->str_stream_addr = tfe_stream_addr_to_str(_stream->head.addr);