mirror of https://github.com/yandex/odyssey.git
machinarium: remake req cancel logic; add req refs
This commit is contained in:
parent
936583da43
commit
af149f8326
|
@ -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);
|
||||
|
|
30
lib/mm_io.c
30
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)
|
||||
{
|
||||
|
|
|
@ -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)
|
||||
|
|
Loading…
Reference in New Issue