machinarium: remake req cancel logic; add req refs

This commit is contained in:
Dmitry Simonenko 2016-12-07 18:16:35 +03:00
parent 936583da43
commit af149f8326
3 changed files with 21 additions and 23 deletions

View File

@ -16,7 +16,7 @@ mm_getaddrinfo_timeout_cb(uv_timer_t *handle)
io->gai_timeout = 1; io->gai_timeout = 1;
/* cancel request, /* cancel request,
* callback will be called anyway */ * callback will be called anyway */
mm_io_cancel_req(io, (uv_req_t*)&io->gai); uv_cancel((uv_req_t*)&io->gai);
} }
static void static void
@ -25,7 +25,7 @@ mm_getaddrinfo_cancel_cb(mmfiber *fiber, void *arg)
mmio *io = arg; mmio *io = arg;
io->gai_timeout = 0; io->gai_timeout = 0;
mm_io_timer_stop(io, &io->gai_timer); 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 static void
@ -38,8 +38,7 @@ mm_getaddrinfo_cb(uv_getaddrinfo_t *handle, int status, struct addrinfo *res)
goto wakeup; goto wakeup;
mm_io_timer_stop(io, &io->gai_timer); mm_io_timer_stop(io, &io->gai_timer);
wakeup: wakeup:
if (status == UV_ECANCELED) mm_io_req_unref(io);
mm_io_on_cancel_req(io);
io->gai_status = status; io->gai_status = status;
io->gai_result = res; io->gai_result = res;
mm_wakeup(io->f, io->gai_fiber); 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; io->gai_fiber = NULL;
return rc; return rc;
} }
mm_io_req_ref(io);
mm_fiber_op_begin(io->gai_fiber, mm_getaddrinfo_cancel_cb, io); mm_fiber_op_begin(io->gai_fiber, mm_getaddrinfo_cancel_cb, io);
mm_scheduler_yield(&io->f->scheduler); mm_scheduler_yield(&io->f->scheduler);
mm_fiber_op_end(io->gai_fiber); mm_fiber_op_end(io->gai_fiber);

View File

@ -17,7 +17,7 @@ mm_io_new(mm_t envp)
return NULL; return NULL;
/* tcp */ /* tcp */
io->close_ref = 0; io->close_ref = 0;
io->cancel_ref = 0; io->req_ref = 0;
io->fd = -1; io->fd = -1;
io->f = env; io->f = env;
uv_tcp_init(&env->loop, &io->handle); uv_tcp_init(&env->loop, &io->handle);
@ -69,7 +69,7 @@ mm_io_new(mm_t envp)
static void static void
mm_io_free(mmio *io) mm_io_free(mmio *io)
{ {
if (io->cancel_ref > 0) if (io->req_ref > 0)
return; return;
if (io->close_ref > 0) if (io->close_ref > 0)
return; return;
@ -94,20 +94,6 @@ mm_io_close_cb(uv_handle_t *handle)
mm_io_free(io); 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) void mm_io_close_handle(mmio *io, uv_handle_t *handle)
{ {
if (uv_is_closing(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); 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_API void
mm_close(mm_io_t iop) mm_close(mm_io_t iop)
{ {

View File

@ -13,7 +13,7 @@ struct mmio {
uv_os_sock_t fd; uv_os_sock_t fd;
uv_tcp_t handle; uv_tcp_t handle;
int close_ref; int close_ref;
int cancel_ref; int req_ref;
mm *f; mm *f;
/* getaddrinfo */ /* getaddrinfo */
uv_getaddrinfo_t gai; uv_getaddrinfo_t gai;
@ -51,10 +51,10 @@ struct mmio {
mmfiber *write_fiber; mmfiber *write_fiber;
}; };
void mm_io_cancel_req(mmio*, uv_req_t*);
void mm_io_close_handle(mmio*, uv_handle_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 static inline void
mm_io_timer_start(mmio *io, uv_timer_t *timer, uv_timer_cb callback, uint64_t time_ms) mm_io_timer_start(mmio *io, uv_timer_t *timer, uv_timer_cb callback, uint64_t time_ms)