diff -Nru wpjabber-1.1.5.orig/wpj_epoll/Makefile wpjabber-1.1.5/wpj_epoll/Makefile --- wpjabber-1.1.5.orig/wpj_epoll/Makefile Fri Jun 13 13:42:15 2003 +++ wpjabber-1.1.5/wpj_epoll/Makefile Mon Jan 19 22:46:48 2004 @@ -2,7 +2,7 @@ include ../platform-settings CFLAGS=$(COMMON_CFLAGS) -I../jabberd/lib -DHAVE_SSL -LIBS= -lssl -lcrypto +LIBS= -lssl -lcrypto -lepoll JABD=../jabberd jabberd_XODEOBJECTS = \ diff -Nru wpjabber-1.1.5.orig/wpj_epoll/io.c wpjabber-1.1.5/wpj_epoll/io.c --- wpjabber-1.1.5.orig/wpj_epoll/io.c Tue Jul 1 11:00:17 2003 +++ wpjabber-1.1.5/wpj_epoll/io.c Tue Jan 20 19:51:46 2004 @@ -210,21 +210,21 @@ } /* - * dev/epoll set + * epoll set ops */ int fdop(int fd,int op){ - struct pollfd pfd; - pfd.fd = fd; - pfd.events = op; - pfd.revents = 0; - if (write(io__data->epollfd, &pfd, sizeof(pfd)) != sizeof(pfd)) { + struct epoll_event ev; + ev.events = EPOLLIN | EPOLLOUT | EPOLLERR | EPOLLHUP; + ev.data.u64 = 0; /* really needed? */ + ev.data.fd = fd; + if ((epoll_ctl(io__data->epollfd, op, fd, &ev)) != 0) { log_alert(ZONE,"fdop error"); return -1; } return 0; } -#define ADDFD POLLIN | POLLOUT | POLLERR | POLLHUP -#define REMFD POLLREMOVE +#define ADDFD EPOLL_CTL_ADD +#define REMFD EPOLL_CTL_DEL /* * unlinks a socket from the master list @@ -614,7 +614,7 @@ { if (m != io__data->listenio) return; - /* add to dev/epoll */ + /* remove from epoll set */ fdop(m->fd, REMFD); /* close the socket, and free all memory */ @@ -705,8 +705,6 @@ return new; } -int poll(struct pollfd *ufds, unsigned int nfds, int timeout); - void * _io_connect(void *arg) { connect_data cd = (connect_data)arg; @@ -1039,9 +1037,6 @@ int server_read_count; /* reads every DEF_READ_SERVER in client loop */ int free_size=-1; - /* dev/epoll */ - struct pollfd *pfds; - struct evpoll evp; datatime = iotime = timeGetTimeSec(); /* get sec */ @@ -1101,7 +1096,7 @@ /* and make sure that they are in the read set */ if ( fdop(cur->fd, ADDFD) < 0) { - log_alert(ZONE,"unable to add client to dev/epoll"); + log_alert(ZONE,"unable to add client to epoll set"); } /* try to read from opened server socket */ @@ -1398,19 +1393,16 @@ if (datacheck == 1) datacheck = 0; /* ################# ACTIVE READ ######################## */ - /* dev/epoll */ - evp.ep_timeout = 0; /* no wait */ - evp.ep_resoff = 0; - nfds = ioctl(io__data->epollfd, EP_POLL, &evp); - pfds = (struct pollfd *) (io__data->epollmap + evp.ep_resoff); + /* epoll */ + nfds = epoll_wait(io__data->epollfd, io__data->evp, wpj->cfg->epoll_maxevents, 0); /* check sockets */ server_read_count = 0; /* how often check server for read */ for (i = 0; i < nfds; i++) { /* check if we need to read from server */ - if ((io__data->serverio)&&(pfds[i].fd == io__data->serverio->fd )) { - if (pfds[i].revents & POLLIN) { + if ((io__data->serverio)&&(io__data->evp[i].data.fd == io__data->serverio->fd )) { + if (io__data->evp[i].events & EPOLLIN) { /* read from server */ server_read_count = 0; @@ -1421,12 +1413,12 @@ } else /* error server */ - if (pfds[i].revents & (POLLHUP|POLLERR)) { + if (io__data->evp[i].events & (EPOLLHUP|EPOLLERR)) { io_close(io__data->serverio); }/* error server */ } else - if ((io__data->listenio)&&(pfds[i].fd == io__data->listenio->fd )) { + if ((io__data->listenio)&&(io__data->evp[i].data.fd == io__data->listenio->fd )) { /* accept new connection */ cur = NULL; while (cur != ((void *)-1)){ @@ -1439,7 +1431,7 @@ cur->k.val = cur->k.restore; log_debug(ZONE,"accepted socket karma restore =>%d",cur->k.restore); - /* add do dev/epoll */ + /* add to epoll set */ fdop(cur->fd,ADDFD); add_client(cur->fd,cur); @@ -1481,7 +1473,7 @@ } /* find cur in client hash */ - cur = find_client(pfds[i].fd); + cur = find_client(io__data->evp[i].data.fd); if (cur == NULL) continue; /* go */ @@ -1492,8 +1484,8 @@ } /* error */ - if (pfds[i].revents & (POLLHUP|POLLERR)) { - log_alert(ZONE,"socket close - HUB,ERR"); + if (io__data->evp[i].events & (EPOLLHUP|EPOLLERR)) { + log_alert(ZONE,"socket close - HUP,ERR"); io_close(cur); temp = cur; close_client(temp); @@ -1501,7 +1493,7 @@ } /* read event */ - if (pfds[i].revents & POLLIN) { + if (io__data->evp[i].events & EPOLLIN) { /* can read */ /* update last socket reaction */ cur->last_io = time; @@ -1537,7 +1529,7 @@ }/*read*/ else /* write */ - if (pfds[i].revents & POLLOUT) { + if (io__data->evp[i].events & EPOLLOUT) { if (cur->queue != NULL){ /* if something to write */ int ret; @@ -1575,7 +1567,7 @@ { /* malloc our instance object */ io__data = pmalloco(wpj->p, sizeof(_ios)); - io__data->karma_time = wpj->cfg->karma_time; + io__data->karma_time = wpj->cfg->karma_time; io__data->listenio = NULL; io__data->serverio = NULL; @@ -1587,17 +1579,16 @@ RateInit(DEF_RATE_CONN,DEF_RATE_TIME,DEF_CONN); - /* init /dev/epoll */ - io__data->epollfd = open("/dev/epoll",O_RDWR); + /* init epoll fd and events array */ + io__data->evp = NULL; + io__data->epollfd = epoll_create(wpj->cfg->epoll_size); if (io__data->epollfd != -1) { - ioctl(io__data->epollfd, EP_ALLOC,wpj->cfg->max_clients+10); - io__data->epollmap=(char *)mmap(NULL, EP_MAP_SIZE(wpj->cfg->max_clients+10), PROT_READ | PROT_WRITE, MAP_PRIVATE, io__data->epollfd, 0); - - log_debug(ZONE,"epoll %d, %p",io__data->epollfd,io__data->epollmap); + log_debug(ZONE,"epoll fd created: %d (size=%d)",io__data->epollfd, wpj->cfg->epoll_size); + io__data->evp = pmalloco(wpj->p, wpj->cfg->epoll_maxevents); } else { - log_alert("epoll error","Can't open /dev/epoll. Read README for more info"); + log_alert("epoll error","Can't epoll_create(%d). Read README for more info", wpj->cfg->epoll_size); } /* init working threads */ @@ -1664,8 +1655,7 @@ /* stop rate */ RateStop(); - /* stop dev/epoll */ - munmap(io__data->epollmap, EP_MAP_SIZE(wpj->cfg->max_clients+10)); + /* close epoll fd */ close(io__data->epollfd); log_alert(ZONE,"IO stop end"); @@ -2054,10 +2044,10 @@ /* listenio */ io__data->listenio = new; - /* add to dev/epoll */ + /* add to epoll set */ if ( fdop(fd, ADDFD) < 0) { _io_close_listen(new); - log_alert(ZONE,"unable to add listen do dev/epoll"); + log_alert(ZONE,"unable to add listen to epoll set"); new = NULL; } diff -Nru wpjabber-1.1.5.orig/wpj_epoll/wpj.c wpjabber-1.1.5/wpj_epoll/wpj.c --- wpjabber-1.1.5.orig/wpj_epoll/wpj.c Tue Jun 24 12:28:47 2003 +++ wpjabber-1.1.5/wpj_epoll/wpj.c Tue Jan 20 19:50:25 2004 @@ -253,6 +253,8 @@ wpj->cfg->max_clients = j_atoi(xmlnode_get_tag_data(xcfg, "max_clients"), DEF_MAX_CLIENTS-5); + wpj->cfg->epoll_size = j_atoi(xmlnode_get_tag_data(xcfg, "epoll_size"), DEF_EPOLL_SIZE); + wpj->cfg->epoll_maxevents = j_atoi(xmlnode_get_tag_data(xcfg, "epoll_maxevents"), DEF_EPOLL_MAXEVENTS); if (wpj->cfg->max_clients > DEF_MAX_CLIENTS-5) wpj->cfg->max_clients = DEF_MAX_CLIENTS-5; diff -Nru wpjabber-1.1.5.orig/wpj_epoll/wpj.h wpjabber-1.1.5/wpj_epoll/wpj.h --- wpjabber-1.1.5.orig/wpj_epoll/wpj.h Tue Jun 24 12:28:29 2003 +++ wpjabber-1.1.5/wpj_epoll/wpj.h Tue Jan 20 19:58:45 2004 @@ -22,6 +22,8 @@ #define DEF_RECONNECTTIME 60*5 /* 5 min to reconnect server */ #define DEF_MAX_CLIENTS 16000 /* max clients */ +#define DEF_EPOLL_SIZE 1000 /* initial epoll set size */ +#define DEF_EPOLL_MAXEVENTS 2000 /* maximal number of epoll events returned by epoll_wait() */ #define DEF_READ_SERVER 30 /* in client loop how often read from server */ @@ -31,7 +33,8 @@ #define CLIENT_SOCKET_BUFFER 8192 -#include +#include +#include #include #include @@ -57,12 +60,9 @@ #include #include -#include #include #include -#include -#include #include #include @@ -368,6 +368,8 @@ int reconnect_time; DWORD karma_time; volatile server_info si; + int epoll_size; /* initial epoll set size */ + int epoll_maxevents; /* maximal number of epoll events returned by epoll_wait() */ #ifdef HAVE_SSL int ssl; #endif @@ -409,8 +411,8 @@ pthread_t wt; /* server write thread */ volatile int shutdown; /* flag to shutdown */ DWORD karma_time; /* karma update time */ - int epollfd; /* dev/epoll */ - char *epollmap; /* dev/epoll */ + int epollfd; /* sys_epoll */ + struct epoll_event * evp; /* epoll events array */ } _ios,*ios;