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;
|
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);
|
||||||
|
|
30
lib/mm_io.c
30
lib/mm_io.c
|
@ -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)
|
||||||
{
|
{
|
||||||
|
|
|
@ -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)
|
||||||
|
|
Loading…
Reference in New Issue