From 5900bb4d4994ad9d90c75f7199529a4e0264f5c6 Mon Sep 17 00:00:00 2001 From: Dmitry Simonenko Date: Tue, 11 Apr 2017 16:48:40 +0300 Subject: [PATCH] machinarium: add separate machine_free_io() method --- src/machinarium.h | 5 ++- src/machinarium_private.h | 8 ++++ src/mm_close.c | 89 +++++++++++++++++++++++++++++++++++++++ 3 files changed, 101 insertions(+), 1 deletion(-) create mode 100644 src/mm_close.c diff --git a/src/machinarium.h b/src/machinarium.h index 07fcefdb..d06a9160 100644 --- a/src/machinarium.h +++ b/src/machinarium.h @@ -110,7 +110,7 @@ MACHINE_API machine_io_t machine_create_io(machine_t); MACHINE_API void -machine_close(machine_io_t); +machine_free_io(machine_io_t); MACHINE_API int machine_errno(machine_io_t); @@ -179,4 +179,7 @@ machine_write(machine_io_t, char *buf, int size, uint64_t time_ms); MACHINE_API int machine_write_timedout(machine_io_t); +MACHINE_API int +machine_close(machine_io_t); + #endif diff --git a/src/machinarium_private.h b/src/machinarium_private.h index 5a0119c9..1a6c704a 100644 --- a/src/machinarium_private.h +++ b/src/machinarium_private.h @@ -18,8 +18,11 @@ #include #include #include +#include #include #include +#include +#include #include #include @@ -45,10 +48,15 @@ #include "mm_scheduler.h" #include "mm.h" +#include "mm_socket.h" #include "mm_tls.h" /* #include "mm_tls_io.h" +*/ + #include "mm_io.h" + +/* #include "mm_read.h" #include "mm_write.h" */ diff --git a/src/mm_close.c b/src/mm_close.c new file mode 100644 index 00000000..f00cd32e --- /dev/null +++ b/src/mm_close.c @@ -0,0 +1,89 @@ + +/* + * machinarium. + * + * cooperative multitasking engine. +*/ + +#include +#include + +#if 0 +static void +mm_io_free(mm_io_t *io) +{ + if (io->req_ref > 0) + return; + if (io->close_ref > 0) + return; + if (! uv_is_closing((uv_handle_t*)&io->gai_timer)) + return; + if (! uv_is_closing((uv_handle_t*)&io->connect_timer)) + return; + if (! uv_is_closing((uv_handle_t*)&io->read_timer)) + return; + if (! uv_is_closing((uv_handle_t*)&io->write_timer)) + return; + mm_buf_free(&io->read_ahead); + free(io); +} + +static void +mm_io_close_cb(uv_handle_t *handle) +{ + mm_io_t *io = handle->data; + io->close_ref--; + assert(io->close_ref >= 0); + mm_io_free(io); +} + +void mm_io_close_handle(mm_io_t *io, uv_handle_t *handle) +{ + if (uv_is_closing(handle)) + return; + io->close_ref++; + uv_close(handle, mm_io_close_cb); +} + +void mm_io_req_ref(mm_io_t *io) +{ + io->req_ref++; +} + +void mm_io_req_unref(mm_io_t *io) +{ + io->req_ref--; + assert(io->req_ref >= 0); + mm_io_free(io); +} + +MACHINE_API int +machine_close(machine_io_t obj) +{ + mm_io_t *io = obj; + mm_io_read_stop(io); + 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); + mm_io_close_handle(io, (uv_handle_t*)&io->handle); + return 0; +} +#endif + +MACHINE_API int +machine_close(machine_io_t obj) +{ + mm_io_t *io = obj; + /*mm_io_read_stop(io);*/ + if (io->fd == -1) { + mm_io_set_errno(io, EBADF); + return -1; + } + close(io->fd); + io->connected = 0; + io->fd = -1; + io->handle.callback = NULL; + io->handle.fd = -1; + return 0; +}