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;
|
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);
|
||||||
|
|
|
@ -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)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue