#34 实现HTTP解析层的Suspend/Resume操作
This commit is contained in:
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user