|
Simple coroutine library integrated with IO event loop (libevent) / objects in plain C Snapshot
|
a socket attached to user mode thread. More...
Classes | |
| struct | tagEVSOCKET |
Typedefs | |
| typedef struct tagEVSOCKET | EVSOCKET |
Enumerations | |
| enum | EVSOCKET_STATE { EVSOCKET_STATE_INIT, EVSOCKET_STATE_CONNECTING, EVSOCKET_STATE_CONNECTED, EVSOCKET_STATE_READING, EVSOCKET_STATE_WRITING, EVSOCKET_STATE_CLOSED, EVSOCKET_STATE_ERROR } |
Functions | |
| EVSOCKET * | EVSOCKET_init (EVTHREAD *thread, int fd, int is_connected) |
| int | EVSOCKET_close (EVSOCKET *socket) |
| int | EVSOCKET_connect (EVSOCKET *socket, struct sockaddr *address, socklen_t socklen, struct timeval timeout) |
| void | EVSOCKET_set_idle_timeout (EVSOCKET *socket, struct timeval timeout) |
| int | EVSOCKET_recv (EVSOCKET *socket, void *buf, size_t buf_size, int flags, struct timeval timeout) |
| int | EVSOCKET_recv_all (EVSOCKET *socket, void *buf, size_t buf_size, int flags, struct timeval timeout) |
| int | EVSOCKET_send (EVSOCKET *socket, void *buf, size_t buf_size, int flags, struct timeval timeout) |
a socket attached to user mode thread.
| typedef struct tagEVSOCKET EVSOCKET |
| enum EVSOCKET_STATE |
| EVSOCKET_STATE_INIT | |
| EVSOCKET_STATE_CONNECTING | |
| EVSOCKET_STATE_CONNECTED | |
| EVSOCKET_STATE_READING | |
| EVSOCKET_STATE_WRITING | |
| EVSOCKET_STATE_CLOSED | |
| EVSOCKET_STATE_ERROR |
Definition at line 178 of file evthread.h.
| int EVSOCKET_close | ( | EVSOCKET * | socket | ) |
Definition at line 279 of file evthread.c.
{
int rt;
if ( socket->fd == -1) {
return -1;
}
if (socket->timer_idle_timeout) {
EVTIMER_free( socket->timer_idle_timeout );
}
if (socket->timer_io_timeout) {
EVTIMER_free( socket->timer_io_timeout);
}
event_del( &socket->read_event );
event_del( &socket->write_event );
do {
rt = close(socket->fd);
} while(rt == -1 && errno == EINTR);
socket->fd = -1;
EVTHREAD_OBJECT_free( &socket->object_base );
return rt;
}
| int EVSOCKET_connect | ( | EVSOCKET * | socket, |
| struct sockaddr * | address, | ||
| socklen_t | socklen, | ||
| struct timeval | timeout | ||
| ) |
Definition at line 353 of file evthread.c.
{
int rt;
VALUES *rvalues;
int event_id;
if (socket->state != EVSOCKET_STATE_INIT) {
return -1;
}
do {
rt = connect( socket->fd, address, socklen );
} while (rt == -1 && errno == EINTR);
if (rt == 0) {
MLOG_DEBUG( "socket %d connected", socket->fd );
socket->state = EVSOCKET_STATE_CONNECTED;
return 0;
}
if (rt == -1) {
if (errno == EINPROGRESS) {
socket->state = EVSOCKET_STATE_CONNECTING;
socket->timer_io_timeout = EVTIMER_init( socket->thread, TIMER_ID_COMM_TIMEOUT, timeout );
if (socket->timer_io_timeout) {
EVTIMER_start(socket->timer_io_timeout);
}
event_add( &socket->write_event, 0 );
CTHREAD_yield( &rvalues, 0 );
VALUES_scan( rvalues, "%d", &event_id );
event_del( &socket->write_event );
if (socket->timer_io_timeout) {
EVTIMER_free( socket->timer_io_timeout );
socket->timer_io_timeout = 0;
}
switch(event_id) {
case EVENT_ID_HAS_IO_EVENT:
MLOG_DEBUG( "socket %d connected", socket->fd );
socket->state = EVSOCKET_STATE_CONNECTED;
rt = 0;
break;
default:
MLOG_DEBUG( "socket %d connect timeout", socket->fd );
socket->state = EVSOCKET_STATE_ERROR;
close( socket->fd );
socket->fd = -1;
rt = -1;
break;
}
} else {
MLOG_DEBUG("socket %d connect error, errno %d", socket->fd, errno );
}
}
return rt;
}
Definition at line 242 of file evthread.c.
{
EVSOCKET *socket;
socket = (EVSOCKET *) malloc( sizeof( EVSOCKET ) );
if (!socket) {
return 0;
}
socket->fd = fd;
socket->timer_idle_timeout = 0;
socket->timer_io_timeout = 0;
socket->state = is_connected ? EVSOCKET_STATE_CONNECTED : EVSOCKET_STATE_INIT;
socket->thread = thread;
socket->loop = thread->loop;
memset( &socket->idle_timeout, 0 , sizeof(struct timeval));
if (fd_set_blocking( fd, 0 )) {
free(socket);
return 0;
}
EVTHREAD_OBJECT_init( &socket->object_base, EVTHREAD_OBJECT_SOCKET , thread );
event_set( &socket->read_event, fd, EV_READ , socket_cb, (void *) socket );
event_base_set( socket->loop->ev_base, &socket->read_event );
event_set( &socket->write_event, fd, EV_WRITE , socket_cb, (void *) socket );
event_base_set( socket->loop->ev_base, &socket->write_event );
return socket;
}
| int EVSOCKET_recv | ( | EVSOCKET * | socket, |
| void * | buf, | ||
| size_t | buf_size, | ||
| int | flags, | ||
| struct timeval | timeout | ||
| ) |
Definition at line 558 of file evthread.c.
{
int rt;
rt = EVSOCKET_recv_internal( socket, buf, buf_size, flags, timeout );
if (rt >= 0) {
if (socket->timer_idle_timeout) {
EVTIMER_start(socket->timer_idle_timeout);
}
}
return rt;
}
| int EVSOCKET_recv_all | ( | EVSOCKET * | socket, |
| void * | buf, | ||
| size_t | buf_size, | ||
| int | flags, | ||
| struct timeval | timeout | ||
| ) |
Definition at line 571 of file evthread.c.
{
uint8_t *cur = (uint8_t *) buf;
int pos, rt;
for(pos = 0 ; buf_size != 0 ; pos += rt ) {
rt = EVSOCKET_recv_internal( socket, cur, buf_size, flags, timeout );
if (rt <= 0) {
return rt;
}
cur += rt;
buf_size -= rt;
}
if (rt >= 0) {
if (socket->timer_idle_timeout) {
EVTIMER_start(socket->timer_idle_timeout);
}
}
return pos;
}
| int EVSOCKET_send | ( | EVSOCKET * | socket, |
| void * | buf, | ||
| size_t | buf_size, | ||
| int | flags, | ||
| struct timeval | timeout | ||
| ) |
Definition at line 594 of file evthread.c.
{
uint8_t *cur = (uint8_t *) buf;
int pos, rt;
for(pos = 0 ; buf_size != 0 ; pos += rt ) {
rt = EVSOCKET_send_internal( socket, cur, buf_size, flags, timeout );
if (rt < 0) {
return -1;
}
cur += rt;
buf_size -= rt;
}
return pos;
}
| void EVSOCKET_set_idle_timeout | ( | EVSOCKET * | socket, |
| struct timeval | timeout | ||
| ) |
Definition at line 339 of file evthread.c.
{
M_UNUSED( socket );
M_UNUSED( timeout );
socket->idle_timeout = timeout;
if (socket->state == EVSOCKET_STATE_CONNECTED) {
socket->timer_idle_timeout = EVTIMER_init( socket->thread, TIMER_ID_IDLE_TIMEOUT, timeout );
if (socket->timer_idle_timeout) {
EVTIMER_start(socket->timer_idle_timeout);
}
}
}
1.7.4