From af149f8326e39fd4477da7397ab17af4d76e94bd Mon Sep 17 00:00:00 2001 From: Dmitry Simonenko Date: Wed, 7 Dec 2016 18:16:35 +0300 Subject: [PATCH] machinarium: remake req cancel logic; add req refs --- lib/mm_getaddrinfo.c | 8 ++++---- lib/mm_io.c | 30 ++++++++++++++---------------- lib/mm_io.h | 6 +++--- 3 files changed, 21 insertions(+), 23 deletions(-) diff --git a/lib/mm_getaddrinfo.c b/lib/mm_getaddrinfo.c index 6070b8fe..c4d8d672 100644 --- a/lib/mm_getaddrinfo.c +++ b/lib/mm_getaddrinfo.c @@ -16,7 +16,7 @@ mm_getaddrinfo_timeout_cb(uv_timer_t *handle) io->gai_timeout = 1; /* cancel request, * callback will be called anyway */ - mm_io_cancel_req(io, (uv_req_t*)&io->gai); + uv_cancel((uv_req_t*)&io->gai); } static void @@ -25,7 +25,7 @@ mm_getaddrinfo_cancel_cb(mmfiber *fiber, void *arg) mmio *io = arg; io->gai_timeout = 0; mm_io_timer_stop(io, &io->gai_timer); - mm_io_cancel_req(io, (uv_req_t*)&io->gai); + uv_cancel((uv_req_t*)&io->gai); } static void @@ -38,8 +38,7 @@ mm_getaddrinfo_cb(uv_getaddrinfo_t *handle, int status, struct addrinfo *res) goto wakeup; mm_io_timer_stop(io, &io->gai_timer); wakeup: - if (status == UV_ECANCELED) - mm_io_on_cancel_req(io); + mm_io_req_unref(io); io->gai_status = status; io->gai_result = res; mm_wakeup(io->f, io->gai_fiber); @@ -71,6 +70,7 @@ mm_getaddrinfo(mm_io_t iop, char *addr, char *service, io->gai_fiber = NULL; return rc; } + mm_io_req_ref(io); mm_fiber_op_begin(io->gai_fiber, mm_getaddrinfo_cancel_cb, io); mm_scheduler_yield(&io->f->scheduler); mm_fiber_op_end(io->gai_fiber); diff --git a/lib/mm_io.c b/lib/mm_io.c index 7e68a28a..62613be3 100644 --- a/lib/mm_io.c +++ b/lib/mm_io.c @@ -17,7 +17,7 @@ mm_io_new(mm_t envp) return NULL; /* tcp */ io->close_ref = 0; - io->cancel_ref = 0; + io->req_ref = 0; io->fd = -1; io->f = env; uv_tcp_init(&env->loop, &io->handle); @@ -69,7 +69,7 @@ mm_io_new(mm_t envp) static void mm_io_free(mmio *io) { - if (io->cancel_ref > 0) + if (io->req_ref > 0) return; if (io->close_ref > 0) return; @@ -94,20 +94,6 @@ mm_io_close_cb(uv_handle_t *handle) 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)) @@ -116,6 +102,18 @@ void mm_io_close_handle(mmio *io, uv_handle_t *handle) uv_close(handle, mm_io_close_cb); } +void mm_io_req_ref(mmio *io) +{ + io->req_ref++; +} + +void mm_io_req_unref(mmio *io) +{ + io->req_ref--; + assert(io->req_ref >= 0); + mm_io_free(io); +} + MM_API void mm_close(mm_io_t iop) { diff --git a/lib/mm_io.h b/lib/mm_io.h index 055b85d1..95abd606 100644 --- a/lib/mm_io.h +++ b/lib/mm_io.h @@ -13,7 +13,7 @@ struct mmio { uv_os_sock_t fd; uv_tcp_t handle; int close_ref; - int cancel_ref; + int req_ref; mm *f; /* getaddrinfo */ uv_getaddrinfo_t gai; @@ -51,10 +51,10 @@ 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*); +void mm_io_req_ref(mmio*); +void mm_io_req_unref(mmio*); static inline void mm_io_timer_start(mmio *io, uv_timer_t *timer, uv_timer_cb callback, uint64_t time_ms)