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;
/* 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);

View File

@ -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)
{

View File

@ -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)