|
|
|
@ -34,9 +34,11 @@ |
|
|
|
#include "tr/connection.h" |
|
|
|
#include "tr/connect_entry_point.h" |
|
|
|
|
|
|
|
#define MAXEVENTS 64 |
|
|
|
#define MAXEVENTS 256 |
|
|
|
|
|
|
|
struct epoll_event events[64]; |
|
|
|
struct epoll_event events[MAXEVENTS]; |
|
|
|
|
|
|
|
extern int count_write_ready; |
|
|
|
|
|
|
|
static |
|
|
|
int |
|
|
|
@ -44,9 +46,16 @@ commManagerEpollCtor(void * _this, va_list * params) |
|
|
|
{ |
|
|
|
TR_CommManagerEpoll this = _this; |
|
|
|
TR_CommManager cmgr = _this; |
|
|
|
nfds_t i; |
|
|
|
|
|
|
|
TR_PARENTCALL(TR_CommManagerEpoll, _this, TR_Class, ctor, params); |
|
|
|
this->handle = epoll_create(cmgr->n_endpoints); |
|
|
|
this->events = TR_malloc(sizeof(struct epoll_event) * cmgr->n_endpoints); |
|
|
|
for (i = 0; i < cmgr->n_endpoints; i++) { |
|
|
|
this->events[i].data.ptr = NULL; |
|
|
|
this->events[i].events = EPOLLET | EPOLLONESHOT; |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
return 0; |
|
|
|
} |
|
|
|
@ -58,19 +67,21 @@ commManagerEpollDtor(void * _this) |
|
|
|
TR_CommManagerEpoll this = _this; |
|
|
|
|
|
|
|
close(this->handle); |
|
|
|
TR_MEM_FREE(this->events); |
|
|
|
TR_PARENTCALL(TR_CommManagerEpoll, _this, TR_Class, dtor); |
|
|
|
} |
|
|
|
|
|
|
|
static |
|
|
|
void |
|
|
|
TR_commManagerEpollAddEndpoint(void * _this, TR_CommEndPoint endpoint) |
|
|
|
{ |
|
|
|
TR_CommManagerEpoll this = _this; |
|
|
|
struct epoll_event event; |
|
|
|
TR_CommManagerEpoll this = _this; |
|
|
|
int handle = endpoint->transport->handle; |
|
|
|
|
|
|
|
event.data.ptr = endpoint; |
|
|
|
event.events = EPOLLIN | EPOLLET; |
|
|
|
this->events[handle].data.ptr = endpoint; |
|
|
|
this->events[handle].events |= EPOLLIN; |
|
|
|
|
|
|
|
epoll_ctl(this->handle, EPOLL_CTL_ADD, endpoint->transport->handle, &event); |
|
|
|
epoll_ctl(this->handle, EPOLL_CTL_ADD, handle, &(this->events[handle])); |
|
|
|
} |
|
|
|
|
|
|
|
static |
|
|
|
@ -85,7 +96,7 @@ TR_commManagerEpollSelect(void * _this, TR_Event event, int timeout) |
|
|
|
for (i=0; i<nevents; i++) { |
|
|
|
TR_CommEndPoint endpoint = (TR_CommEndPoint)events[i].data.ptr; |
|
|
|
|
|
|
|
if ((events[i].events & POLLIN) == POLLIN) { |
|
|
|
if ((events[i].events & EPOLLIN) == EPOLLIN) { |
|
|
|
TR_Event event; |
|
|
|
|
|
|
|
if (TR_INSTANCE_OF(TR_TcpSocket, endpoint->transport) |
|
|
|
@ -102,15 +113,18 @@ TR_commManagerEpollSelect(void * _this, TR_Event event, int timeout) |
|
|
|
} |
|
|
|
|
|
|
|
TR_eventHandlerIssueEvent((TR_EventHandler)this, event); |
|
|
|
this->events[i].events &= ~EPOLLIN; |
|
|
|
} |
|
|
|
|
|
|
|
if ((events[i].events & POLLOUT) == POLLOUT) { |
|
|
|
TR_eventHandlerIssueEvent( |
|
|
|
(TR_EventHandler)this, |
|
|
|
TR_eventSubjectEmit( |
|
|
|
(TR_EventSubject)endpoint, |
|
|
|
TR_CEP_EVENT_WRITE_READY, |
|
|
|
NULL)); |
|
|
|
if ((events[i].events & EPOLLOUT) == EPOLLOUT) { |
|
|
|
TR_Event _event = TR_eventSubjectEmit( |
|
|
|
(TR_EventSubject)endpoint, |
|
|
|
TR_CEP_EVENT_WRITE_READY, |
|
|
|
NULL); |
|
|
|
|
|
|
|
TR_eventHandlerIssueEvent((TR_EventHandler)this, _event); |
|
|
|
this->events[i].events &= ~EPOLLOUT; |
|
|
|
count_write_ready++; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
@ -123,16 +137,12 @@ TR_commManagerEpollEnableWrite(void * _this, TR_Event event) |
|
|
|
TR_CommEndPoint endpoint = (TR_CommEndPoint)event->subject; |
|
|
|
|
|
|
|
if (! TR_socketFinWr(endpoint->transport)) { |
|
|
|
struct epoll_event epevent; |
|
|
|
int handle = endpoint->transport->handle; |
|
|
|
|
|
|
|
epevent.data.ptr = endpoint; |
|
|
|
epevent.events = EPOLLOUT | EPOLLIN | EPOLLET; |
|
|
|
this->events[handle].data.ptr = endpoint; |
|
|
|
this->events[handle].events |= EPOLLOUT; |
|
|
|
|
|
|
|
epoll_ctl( |
|
|
|
this->handle, |
|
|
|
EPOLL_CTL_MOD, |
|
|
|
endpoint->transport->handle, |
|
|
|
&epevent); |
|
|
|
epoll_ctl(this->handle, EPOLL_CTL_MOD, handle, &(this->events[handle])); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
@ -142,38 +152,57 @@ TR_commManagerEpollDisableWrite(void * _this, TR_Event event) |
|
|
|
{ |
|
|
|
TR_CommManagerEpoll this = _this; |
|
|
|
TR_CommEndPoint endpoint = (TR_CommEndPoint)event->subject; |
|
|
|
struct epoll_event epevent; |
|
|
|
int handle = endpoint->transport->handle; |
|
|
|
|
|
|
|
epevent.data.ptr = endpoint; |
|
|
|
epevent.events = EPOLLIN | EPOLLET; |
|
|
|
this->events[handle].data.ptr = endpoint; |
|
|
|
this->events[handle].events &= ~EPOLLOUT; |
|
|
|
|
|
|
|
epoll_ctl( |
|
|
|
this->handle, |
|
|
|
EPOLL_CTL_MOD, |
|
|
|
endpoint->transport->handle, |
|
|
|
&epevent); |
|
|
|
epoll_ctl(this->handle, EPOLL_CTL_MOD, handle, &(this->events[handle])); |
|
|
|
} |
|
|
|
|
|
|
|
static |
|
|
|
void |
|
|
|
TR_commManagerEpollClose(void * _this, TR_Event event) |
|
|
|
TR_commManagerEpollEnableRead(void * _this, TR_Event event) |
|
|
|
{ |
|
|
|
TR_CommManagerEpoll this = _this; |
|
|
|
TR_CommEndPoint endpoint = (TR_CommEndPoint)event->subject; |
|
|
|
|
|
|
|
epoll_ctl(this->handle, EPOLL_CTL_DEL, endpoint->transport->handle, NULL); |
|
|
|
if (! TR_socketFinRd(endpoint->transport)) { |
|
|
|
int handle = endpoint->transport->handle; |
|
|
|
|
|
|
|
this->events[handle].data.ptr = endpoint; |
|
|
|
this->events[handle].events |= EPOLLIN; |
|
|
|
|
|
|
|
epoll_ctl(this->handle, EPOLL_CTL_MOD, handle, &(this->events[handle])); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
static |
|
|
|
void |
|
|
|
TR_commManagerEpollEnableRead(void * _this, TR_Event event) |
|
|
|
TR_commManagerEpollDisableRead(void * _this, TR_Event event) |
|
|
|
{ |
|
|
|
TR_CommManagerEpoll this = _this; |
|
|
|
TR_CommEndPoint endpoint = (TR_CommEndPoint)event->subject; |
|
|
|
int handle = endpoint->transport->handle; |
|
|
|
|
|
|
|
this->events[handle].data.ptr = endpoint; |
|
|
|
this->events[handle].events &= ~EPOLLIN; |
|
|
|
|
|
|
|
epoll_ctl(this->handle, EPOLL_CTL_MOD, handle, &(this->events[handle])); |
|
|
|
} |
|
|
|
|
|
|
|
static |
|
|
|
void |
|
|
|
TR_commManagerEpollDisableRead(void * _this, TR_Event event) |
|
|
|
TR_commManagerEpollClose(void * _this, TR_Event event) |
|
|
|
{ |
|
|
|
TR_CommManagerEpoll this = _this; |
|
|
|
TR_CommEndPoint endpoint = (TR_CommEndPoint)event->subject; |
|
|
|
int handle = endpoint->transport->handle; |
|
|
|
|
|
|
|
this->events[handle].data.ptr = NULL; |
|
|
|
this->events[handle].events = EPOLLET | EPOLLONESHOT; |
|
|
|
|
|
|
|
epoll_ctl(this->handle, EPOLL_CTL_DEL, handle, NULL); |
|
|
|
} |
|
|
|
|
|
|
|
static |
|
|
|
|