From 36cd8d17678827d80e559b4325456b9cb4535e81 Mon Sep 17 00:00:00 2001 From: Dmitry Simonenko Date: Wed, 7 Dec 2016 17:57:46 +0300 Subject: [PATCH] machinarium: add cancel request logic --- lib/mm_io.c | 37 ++++++++++++++++++++++++++++++++----- lib/mm_io.h | 4 ++++ 2 files changed, 36 insertions(+), 5 deletions(-) diff --git a/lib/mm_io.c b/lib/mm_io.c index 9a2d030d..7e68a28a 100644 --- a/lib/mm_io.c +++ b/lib/mm_io.c @@ -17,6 +17,7 @@ mm_io_new(mm_t envp) return NULL; /* tcp */ io->close_ref = 0; + io->cancel_ref = 0; io->fd = -1; io->f = env; uv_tcp_init(&env->loop, &io->handle); @@ -24,6 +25,8 @@ mm_io_new(mm_t envp) /* getaddrinfo */ memset(&io->gai, 0, sizeof(io->gai)); uv_timer_init(&env->loop, &io->gai_timer); + io->gai.data = io; + io->gai_timer.data = io; io->gai_fiber = NULL; io->gai_status = 0; io->gai_timeout = 0; @@ -64,14 +67,13 @@ mm_io_new(mm_t envp) } static void -mm_io_close_cb(uv_handle_t *handle) +mm_io_free(mmio *io) { - mmio *io = handle->data; - io->close_ref--; - assert(io->close_ref >= 0); + if (io->cancel_ref > 0) + return; if (io->close_ref > 0) return; - if (! uv_is_closing((uv_handle_t*)&io->handle)) + if (! uv_is_closing((uv_handle_t*)&io->gai_timer)) return; if (! uv_is_closing((uv_handle_t*)&io->connect_timer)) return; @@ -83,6 +85,29 @@ mm_io_close_cb(uv_handle_t *handle) free(io); } +static void +mm_io_close_cb(uv_handle_t *handle) +{ + mmio *io = handle->data; + io->close_ref--; + assert(io->close_ref >= 0); + mm_io_free(io); +} + +void mm_io_on_cancel_req(mmio *io) +{ + io->cancel_ref--; + assert(io->cancel_ref >= 0); + mm_io_free(io); +} + +void mm_io_cancel_req(mmio *io, uv_req_t *req) +{ + int rc = uv_cancel(req); + assert(rc == 0); + io->cancel_ref++; +} + void mm_io_close_handle(mmio *io, uv_handle_t *handle) { if (uv_is_closing(handle)) @@ -96,6 +121,8 @@ mm_close(mm_io_t iop) { mmio *io = iop; mm_io_read_stop(io); + /* gai? */ + mm_io_close_handle(io, (uv_handle_t*)&io->gai_timer); mm_io_close_handle(io, (uv_handle_t*)&io->connect_timer); mm_io_close_handle(io, (uv_handle_t*)&io->read_timer); mm_io_close_handle(io, (uv_handle_t*)&io->write_timer); diff --git a/lib/mm_io.h b/lib/mm_io.h index e63c4609..055b85d1 100644 --- a/lib/mm_io.h +++ b/lib/mm_io.h @@ -13,6 +13,7 @@ struct mmio { uv_os_sock_t fd; uv_tcp_t handle; int close_ref; + int cancel_ref; mm *f; /* getaddrinfo */ uv_getaddrinfo_t gai; @@ -50,8 +51,11 @@ struct mmio { mmfiber *write_fiber; }; +void mm_io_cancel_req(mmio*, uv_req_t*); void mm_io_close_handle(mmio*, uv_handle_t*); +void mm_io_on_cancel_req(mmio*); + static inline void mm_io_timer_start(mmio *io, uv_timer_t *timer, uv_timer_cb callback, uint64_t time_ms) {