From 53f0af4e9e60298b793557e7d0103d121ee58f7a Mon Sep 17 00:00:00 2001 From: Max Lv Date: Sat, 9 Aug 2014 08:54:12 +0800 Subject: [PATCH] refine the timer --- src/local.c | 7 +++++-- src/server.c | 2 -- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/local.c b/src/local.c index 86bd505d..38cf28cd 100644 --- a/src/local.c +++ b/src/local.c @@ -560,8 +560,6 @@ static void remote_timeout_cb(EV_P_ ev_timer *watcher, int revents) LOGD("remote timeout"); - ev_timer_stop(EV_A_ watcher); - close_and_free_remote(EV_A_ remote); close_and_free_server(EV_A_ server); } @@ -572,6 +570,8 @@ static void remote_recv_cb (EV_P_ ev_io *w, int revents) struct remote *remote = remote_recv_ctx->remote; struct server *server = remote->server; + ev_timer_again(EV_A_ &remote->recv_ctx->watcher); + ssize_t r = recv(remote->fd, server->buf, BUF_SIZE, 0); if (r == 0) @@ -656,6 +656,7 @@ static void remote_send_cb (EV_P_ ev_io *w, int revents) { remote_send_ctx->connected = 1; ev_timer_stop(EV_A_ &remote_send_ctx->watcher); + ev_timer_start(EV_A_ &remote->recv_ctx->watcher); ev_io_start(EV_A_ &remote->recv_ctx->io); } else @@ -725,6 +726,7 @@ struct remote* new_remote(int fd, int timeout) ev_io_init(&remote->recv_ctx->io, remote_recv_cb, fd, EV_READ); ev_io_init(&remote->send_ctx->io, remote_send_cb, fd, EV_WRITE); ev_timer_init(&remote->send_ctx->watcher, remote_timeout_cb, timeout, 0); + ev_timer_init(&remote->recv_ctx->watcher, remote_timeout_cb, timeout, timeout * 10); remote->recv_ctx->remote = remote; remote->send_ctx->remote = remote; return remote; @@ -757,6 +759,7 @@ static void close_and_free_remote(EV_P_ struct remote *remote) if (remote != NULL) { ev_timer_stop(EV_A_ &remote->send_ctx->watcher); + ev_timer_stop(EV_A_ &remote->recv_ctx->watcher); ev_io_stop(EV_A_ &remote->send_ctx->io); ev_io_stop(EV_A_ &remote->recv_ctx->io); close(remote->fd); diff --git a/src/server.c b/src/server.c index d63b2d24..ed7cbdd2 100644 --- a/src/server.c +++ b/src/server.c @@ -488,8 +488,6 @@ static void server_timeout_cb(EV_P_ ev_timer *watcher, int revents) LOGE("TCP connection timeout"); - ev_timer_stop(EV_A_ watcher); - close_and_free_remote(EV_A_ remote); close_and_free_server(EV_A_ server); }