mirror of https://github.com/yandex/odyssey.git
machinarium: add separate machine_free_io() method
This commit is contained in:
parent
b25e9b26cf
commit
5900bb4d49
|
@ -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
|
||||
|
|
|
@ -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"
|
||||
*/
|
||||
|
|
|
@ -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;
|
||||
}
|
Loading…
Reference in New Issue