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_create_io(machine_t);
|
||||||
|
|
||||||
MACHINE_API void
|
MACHINE_API void
|
||||||
machine_close(machine_io_t);
|
machine_free_io(machine_io_t);
|
||||||
|
|
||||||
MACHINE_API int
|
MACHINE_API int
|
||||||
machine_errno(machine_io_t);
|
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_API int
|
||||||
machine_write_timedout(machine_io_t);
|
machine_write_timedout(machine_io_t);
|
||||||
|
|
||||||
|
MACHINE_API int
|
||||||
|
machine_close(machine_io_t);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -18,8 +18,11 @@
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
#include <signal.h>
|
#include <signal.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
|
#include <fcntl.h>
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
#include <sys/socket.h>
|
#include <sys/socket.h>
|
||||||
|
#include <netinet/tcp.h>
|
||||||
|
#include <arpa/inet.h>
|
||||||
#include <netdb.h>
|
#include <netdb.h>
|
||||||
#include <sys/epoll.h>
|
#include <sys/epoll.h>
|
||||||
|
|
||||||
|
@ -45,10 +48,15 @@
|
||||||
#include "mm_scheduler.h"
|
#include "mm_scheduler.h"
|
||||||
#include "mm.h"
|
#include "mm.h"
|
||||||
|
|
||||||
|
#include "mm_socket.h"
|
||||||
#include "mm_tls.h"
|
#include "mm_tls.h"
|
||||||
/*
|
/*
|
||||||
#include "mm_tls_io.h"
|
#include "mm_tls_io.h"
|
||||||
|
*/
|
||||||
|
|
||||||
#include "mm_io.h"
|
#include "mm_io.h"
|
||||||
|
|
||||||
|
/*
|
||||||
#include "mm_read.h"
|
#include "mm_read.h"
|
||||||
#include "mm_write.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