machinarium: add cancel request logic

This commit is contained in:
Dmitry Simonenko 2016-12-07 17:57:46 +03:00
parent 78fcb9f2a4
commit 36cd8d1767
2 changed files with 36 additions and 5 deletions

View File

@ -17,6 +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->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);
@ -24,6 +25,8 @@ mm_io_new(mm_t envp)
/* getaddrinfo */ /* getaddrinfo */
memset(&io->gai, 0, sizeof(io->gai)); memset(&io->gai, 0, sizeof(io->gai));
uv_timer_init(&env->loop, &io->gai_timer); uv_timer_init(&env->loop, &io->gai_timer);
io->gai.data = io;
io->gai_timer.data = io;
io->gai_fiber = NULL; io->gai_fiber = NULL;
io->gai_status = 0; io->gai_status = 0;
io->gai_timeout = 0; io->gai_timeout = 0;
@ -64,14 +67,13 @@ mm_io_new(mm_t envp)
} }
static void static void
mm_io_close_cb(uv_handle_t *handle) mm_io_free(mmio *io)
{ {
mmio *io = handle->data; if (io->cancel_ref > 0)
io->close_ref--; return;
assert(io->close_ref >= 0);
if (io->close_ref > 0) if (io->close_ref > 0)
return; return;
if (! uv_is_closing((uv_handle_t*)&io->handle)) if (! uv_is_closing((uv_handle_t*)&io->gai_timer))
return; return;
if (! uv_is_closing((uv_handle_t*)&io->connect_timer)) if (! uv_is_closing((uv_handle_t*)&io->connect_timer))
return; return;
@ -83,6 +85,29 @@ mm_io_close_cb(uv_handle_t *handle)
free(io); 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) void mm_io_close_handle(mmio *io, uv_handle_t *handle)
{ {
if (uv_is_closing(handle)) if (uv_is_closing(handle))
@ -96,6 +121,8 @@ mm_close(mm_io_t iop)
{ {
mmio *io = iop; mmio *io = iop;
mm_io_read_stop(io); 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->connect_timer);
mm_io_close_handle(io, (uv_handle_t*)&io->read_timer); mm_io_close_handle(io, (uv_handle_t*)&io->read_timer);
mm_io_close_handle(io, (uv_handle_t*)&io->write_timer); mm_io_close_handle(io, (uv_handle_t*)&io->write_timer);

View File

@ -13,6 +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;
mm *f; mm *f;
/* getaddrinfo */ /* getaddrinfo */
uv_getaddrinfo_t gai; uv_getaddrinfo_t gai;
@ -50,8 +51,11 @@ 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*);
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)
{ {