machinarium: add separate machine_free_io() method

This commit is contained in:
Dmitry Simonenko 2017-04-11 16:48:40 +03:00
parent b25e9b26cf
commit 5900bb4d49
3 changed files with 101 additions and 1 deletions

View File

@ -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

View File

@ -18,8 +18,11 @@
#include <assert.h>
#include <signal.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/tcp.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <sys/epoll.h>
@ -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"
*/

89
src/mm_close.c Normal file
View File

@ -0,0 +1,89 @@
/*
* machinarium.
*
* cooperative multitasking engine.
*/
#include <machinarium_private.h>
#include <machinarium.h>
#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;
}