23 #include "SelEpolKqEvPrt.h"
25 SelEpolKqEvPrt::SelEpolKqEvPrt() {
26 logger = Logger::getLogger(
"SelEpolKqEvPrt");
29 SelEpolKqEvPrt::~SelEpolKqEvPrt() {
32 void SelEpolKqEvPrt::initialize(
int sockfd)
34 this->sockfd = sockfd;
43 epoll_handle = epoll_create(MAXDESCRIPTORS);
53 if((dev_poll_fd = open(
"/dev/poll", O_RDWR)) <0)
57 if (fcntl(dev_poll_fd, F_SETFD, FD_CLOEXEC) < 0)
59 perror(
"devpoll fcntl");
63 if ((port = port_create()) < 0) {
64 perror(
"port_create");
69 polled_fds = (
struct pollfd *)calloc(1, nfds*
sizeof(
struct pollfd));
70 polled_fds->fd = descriptor;
71 polled_fds->events = POLLIN | POLLPRI;
74 registerForEvent(sockfd);
78 int SelEpolKqEvPrt::getEvents()
83 numEvents = select(fdmax+1, &read_fds, NULL, NULL, NULL);
94 numEvents = epoll_wait(epoll_handle, events, curfds,-1);
97 numEvents = kevent(kq, NULL, 0, evlist, MAXDESCRIPTORS, NULL);
100 struct dvpoll pollit;
101 pollit.dp_timeout = -1;
102 pollit.dp_nfds = curfds;
103 pollit.dp_fds = polled_fds;
104 numEvents = ioctl(dev_poll_fd, DP_POLL, &pollit);
107 uint_t nevents, wevents = 0;
109 if (port_getn(port, evlist, 0, &wevents, NULL) < 0)
return 0;
110 if (0 == wevents) wevents = 1;
112 if (port_getn(port, evlist, (uint_t) MAXDESCRIPTORS, &nevents, NULL) < 0)
return 0;
113 numEvents = (int)nevents;
116 numEvents = poll(polled_fds,nfds,-1);
117 if (numEvents == -1){
125 int SelEpolKqEvPrt::getDescriptor(
int index)
128 if(FD_ISSET(index, &read_fds))
134 if(index>-1 && index<
sizeof events)
136 return events[index].data.fd;
140 if(index>-1 && index<(
int)(
sizeof evlist))
142 return evlist[index].ident;
146 return polled_fds[index].fd;
149 if(index>-1 && index<
sizeof evlist)
151 return (
int)evlist[index].portev_object;
155 return polled_fds[index].fd;
160 bool SelEpolKqEvPrt::isListeningDescriptor(
int descriptor)
162 if(descriptor==sockfd)
169 bool SelEpolKqEvPrt::registerForEvent(
int descriptor)
172 fcntl(descriptor, F_SETFL, fcntl(descriptor, F_GETFD, 0) | O_NONBLOCK);
174 FD_SET(descriptor, &master);
175 if (descriptor > fdmax) {
180 ev.events = EPOLLIN | EPOLLPRI;
181 ev.data.fd = descriptor;
182 if (epoll_ctl(epoll_handle, EPOLL_CTL_ADD, descriptor, &ev) < 0)
185 logger <<
"Error adding to epoll cntl list" << endl;
190 memset(&change, 0,
sizeof(change));
191 EV_SET(&change, descriptor, EVFILT_READ, EV_ADD, 0, 0, 0);
192 kevent(kq, &change, 1, NULL, 0, NULL);
195 struct pollfd poll_fd;
196 poll_fd.fd = descriptor;
197 poll_fd.events = POLLIN;
199 if (write(dev_poll_fd, &poll_fd,
sizeof(poll_fd)) < 0) {
205 if (port_associate(port, PORT_SOURCE_FD, descriptor, POLLIN, NULL) < 0) {
206 perror(
"port_associate");
211 polled_fds = (
struct pollfd *)realloc(polled_fds, (nfds+1)*
sizeof(
struct pollfd));
212 (polled_fds+nfds)->fd = descriptor;
213 (polled_fds+nfds)->events = POLLIN | POLLPRI;
218 bool SelEpolKqEvPrt::unRegisterForEvent(
int descriptor)
220 if(descriptor<=0)
return false;
223 FD_CLR(descriptor, &master);
226 epoll_ctl(epoll_handle, EPOLL_CTL_DEL, descriptor, &ev);
229 memset(&change, 0,
sizeof(change));
230 EV_SET(&change, descriptor, EVFILT_READ, EV_DELETE, 0, 0, 0);
231 kevent(kq, &change, 1, NULL, 0, NULL);
234 struct pollfd poll_fd;
235 poll_fd.fd = descriptor;
236 poll_fd.events = POLLREMOVE;
238 if (write(dev_poll_fd, &poll_fd,
sizeof(poll_fd)) < 0) {
250 memcpy(polled_fds+index,polled_fds+index+1,nfds-index);
251 polled_fds = (
struct pollfd *)realloc(polled_fds, nfds*
sizeof(
struct pollfd));
256 void SelEpolKqEvPrt::reRegisterServerSock()
259 if (port_associate(port, PORT_SOURCE_FD, sockfd, POLLIN, NULL) < 0) {
260 perror(
"port_associate");