mirror of https://github.com/yandex/odyssey.git
machinarium: add cancel request logic
This commit is contained in:
parent
78fcb9f2a4
commit
36cd8d1767
37
lib/mm_io.c
37
lib/mm_io.c
|
@ -17,6 +17,7 @@ mm_io_new(mm_t envp)
|
|||
return NULL;
|
||||
/* tcp */
|
||||
io->close_ref = 0;
|
||||
io->cancel_ref = 0;
|
||||
io->fd = -1;
|
||||
io->f = env;
|
||||
uv_tcp_init(&env->loop, &io->handle);
|
||||
|
@ -24,6 +25,8 @@ mm_io_new(mm_t envp)
|
|||
/* getaddrinfo */
|
||||
memset(&io->gai, 0, sizeof(io->gai));
|
||||
uv_timer_init(&env->loop, &io->gai_timer);
|
||||
io->gai.data = io;
|
||||
io->gai_timer.data = io;
|
||||
io->gai_fiber = NULL;
|
||||
io->gai_status = 0;
|
||||
io->gai_timeout = 0;
|
||||
|
@ -64,14 +67,13 @@ mm_io_new(mm_t envp)
|
|||
}
|
||||
|
||||
static void
|
||||
mm_io_close_cb(uv_handle_t *handle)
|
||||
mm_io_free(mmio *io)
|
||||
{
|
||||
mmio *io = handle->data;
|
||||
io->close_ref--;
|
||||
assert(io->close_ref >= 0);
|
||||
if (io->cancel_ref > 0)
|
||||
return;
|
||||
if (io->close_ref > 0)
|
||||
return;
|
||||
if (! uv_is_closing((uv_handle_t*)&io->handle))
|
||||
if (! uv_is_closing((uv_handle_t*)&io->gai_timer))
|
||||
return;
|
||||
if (! uv_is_closing((uv_handle_t*)&io->connect_timer))
|
||||
return;
|
||||
|
@ -83,6 +85,29 @@ mm_io_close_cb(uv_handle_t *handle)
|
|||
free(io);
|
||||
}
|
||||
|
||||
static void
|
||||
mm_io_close_cb(uv_handle_t *handle)
|
||||
{
|
||||
mmio *io = handle->data;
|
||||
io->close_ref--;
|
||||
assert(io->close_ref >= 0);
|
||||
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))
|
||||
|
@ -96,6 +121,8 @@ mm_close(mm_io_t iop)
|
|||
{
|
||||
mmio *io = iop;
|
||||
mm_io_read_stop(io);
|
||||
/* gai? */
|
||||
mm_io_close_handle(io, (uv_handle_t*)&io->gai_timer);
|
||||
mm_io_close_handle(io, (uv_handle_t*)&io->connect_timer);
|
||||
mm_io_close_handle(io, (uv_handle_t*)&io->read_timer);
|
||||
mm_io_close_handle(io, (uv_handle_t*)&io->write_timer);
|
||||
|
|
|
@ -13,6 +13,7 @@ struct mmio {
|
|||
uv_os_sock_t fd;
|
||||
uv_tcp_t handle;
|
||||
int close_ref;
|
||||
int cancel_ref;
|
||||
mm *f;
|
||||
/* getaddrinfo */
|
||||
uv_getaddrinfo_t gai;
|
||||
|
@ -50,8 +51,11 @@ 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*);
|
||||
|
||||
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