| OLD | NEW | 
|---|
| 1 /* | 1 /* | 
| 2  * Copyright 2000-2003 Niels Provos <provos@citi.umich.edu> | 2  * Copyright 2000-2003 Niels Provos <provos@citi.umich.edu> | 
| 3  * All rights reserved. | 3  * All rights reserved. | 
| 4  * | 4  * | 
| 5  * Redistribution and use in source and binary forms, with or without | 5  * Redistribution and use in source and binary forms, with or without | 
| 6  * modification, are permitted provided that the following conditions | 6  * modification, are permitted provided that the following conditions | 
| 7  * are met: | 7  * are met: | 
| 8  * 1. Redistributions of source code must retain the above copyright | 8  * 1. Redistributions of source code must retain the above copyright | 
| 9  *    notice, this list of conditions and the following disclaimer. | 9  *    notice, this list of conditions and the following disclaimer. | 
| 10  * 2. Redistributions in binary form must reproduce the above copyright | 10  * 2. Redistributions in binary form must reproduce the above copyright | 
| (...skipping 16 matching lines...) Expand all  Loading... | 
| 27 #ifdef HAVE_CONFIG_H | 27 #ifdef HAVE_CONFIG_H | 
| 28 #include "config.h" | 28 #include "config.h" | 
| 29 #endif | 29 #endif | 
| 30 | 30 | 
| 31 #include <stdint.h> | 31 #include <stdint.h> | 
| 32 #include <sys/types.h> | 32 #include <sys/types.h> | 
| 33 #include <sys/resource.h> | 33 #include <sys/resource.h> | 
| 34 #ifdef HAVE_SYS_TIME_H | 34 #ifdef HAVE_SYS_TIME_H | 
| 35 #include <sys/time.h> | 35 #include <sys/time.h> | 
| 36 #else | 36 #else | 
| 37 #include <sys/_time.h> | 37 #include <sys/_libevent_time.h> | 
| 38 #endif | 38 #endif | 
| 39 #include <sys/queue.h> | 39 #include <sys/queue.h> | 
| 40 #include <sys/epoll.h> | 40 #include <sys/epoll.h> | 
| 41 #include <signal.h> | 41 #include <signal.h> | 
| 42 #include <stdio.h> | 42 #include <stdio.h> | 
| 43 #include <stdlib.h> | 43 #include <stdlib.h> | 
| 44 #include <string.h> | 44 #include <string.h> | 
| 45 #include <unistd.h> | 45 #include <unistd.h> | 
| 46 #include <errno.h> | 46 #include <errno.h> | 
| 47 #ifdef HAVE_FCNTL_H | 47 #ifdef HAVE_FCNTL_H | 
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 87 | 87 | 
| 88 #ifdef HAVE_SETFD | 88 #ifdef HAVE_SETFD | 
| 89 #define FD_CLOSEONEXEC(x) do { \ | 89 #define FD_CLOSEONEXEC(x) do { \ | 
| 90         if (fcntl(x, F_SETFD, 1) == -1) \ | 90         if (fcntl(x, F_SETFD, 1) == -1) \ | 
| 91                 event_warn("fcntl(%d, F_SETFD)", x); \ | 91                 event_warn("fcntl(%d, F_SETFD)", x); \ | 
| 92 } while (0) | 92 } while (0) | 
| 93 #else | 93 #else | 
| 94 #define FD_CLOSEONEXEC(x) | 94 #define FD_CLOSEONEXEC(x) | 
| 95 #endif | 95 #endif | 
| 96 | 96 | 
| 97 #define NEVENT  32 |  | 
| 98 |  | 
| 99 /* On Linux kernels at least up to 2.6.24.4, epoll can't handle timeout | 97 /* On Linux kernels at least up to 2.6.24.4, epoll can't handle timeout | 
| 100  * values bigger than (LONG_MAX - 999ULL)/HZ.  HZ in the wild can be | 98  * values bigger than (LONG_MAX - 999ULL)/HZ.  HZ in the wild can be | 
| 101  * as big as 1000, and LONG_MAX can be as small as (1<<31)-1, so the | 99  * as big as 1000, and LONG_MAX can be as small as (1<<31)-1, so the | 
| 102  * largest number of msec we can support here is 2147482.  Let's | 100  * largest number of msec we can support here is 2147482.  Let's | 
| 103  * round that down by 47 seconds. | 101  * round that down by 47 seconds. | 
| 104  */ | 102  */ | 
| 105 #define MAX_EPOLL_TIMEOUT_MSEC (35*60*1000) | 103 #define MAX_EPOLL_TIMEOUT_MSEC (35*60*1000) | 
| 106 | 104 | 
|  | 105 #define INITIAL_NFILES 32 | 
|  | 106 #define INITIAL_NEVENTS 32 | 
|  | 107 #define MAX_NEVENTS 4096 | 
|  | 108 | 
| 107 static void * | 109 static void * | 
| 108 epoll_init(struct event_base *base) | 110 epoll_init(struct event_base *base) | 
| 109 { | 111 { | 
| 110 »       int epfd, nfiles = NEVENT; | 112 »       int epfd; | 
| 111 »       struct rlimit rl; |  | 
| 112         struct epollop *epollop; | 113         struct epollop *epollop; | 
| 113 | 114 | 
| 114         /* Disable epollueue when this environment variable is set */ | 115         /* Disable epollueue when this environment variable is set */ | 
| 115 »       if (getenv("EVENT_NOEPOLL")) | 116 »       if (evutil_getenv("EVENT_NOEPOLL")) | 
| 116                 return (NULL); | 117                 return (NULL); | 
| 117 | 118 | 
| 118         /* Initalize the kernel queue */ | 119         /* Initalize the kernel queue */ | 
| 119 | 120 »       if ((epfd = epoll_create(32000)) == -1) { | 
| 120 »       if ((epfd = epoll_create(nfiles)) == -1) { |  | 
| 121                 if (errno != ENOSYS) | 121                 if (errno != ENOSYS) | 
| 122                         event_warn("epoll_create"); | 122                         event_warn("epoll_create"); | 
| 123                 return (NULL); | 123                 return (NULL); | 
| 124         } | 124         } | 
| 125 | 125 | 
| 126         FD_CLOSEONEXEC(epfd); | 126         FD_CLOSEONEXEC(epfd); | 
| 127 | 127 | 
| 128         if (!(epollop = calloc(1, sizeof(struct epollop)))) | 128         if (!(epollop = calloc(1, sizeof(struct epollop)))) | 
| 129                 return (NULL); | 129                 return (NULL); | 
| 130 | 130 | 
| 131         epollop->epfd = epfd; | 131         epollop->epfd = epfd; | 
| 132 | 132 | 
| 133         /* Initalize fields */ | 133         /* Initalize fields */ | 
| 134 »       epollop->events = malloc(nfiles * sizeof(struct epoll_event)); | 134 »       epollop->events = malloc(INITIAL_NEVENTS * sizeof(struct epoll_event)); | 
| 135         if (epollop->events == NULL) { | 135         if (epollop->events == NULL) { | 
| 136                 free(epollop); | 136                 free(epollop); | 
| 137                 return (NULL); | 137                 return (NULL); | 
| 138         } | 138         } | 
| 139 »       epollop->nevents = nfiles; | 139 »       epollop->nevents = INITIAL_NEVENTS; | 
| 140 | 140 | 
| 141 »       epollop->fds = calloc(nfiles, sizeof(struct evepoll)); | 141 »       epollop->fds = calloc(INITIAL_NFILES, sizeof(struct evepoll)); | 
| 142         if (epollop->fds == NULL) { | 142         if (epollop->fds == NULL) { | 
| 143                 free(epollop->events); | 143                 free(epollop->events); | 
| 144                 free(epollop); | 144                 free(epollop); | 
| 145                 return (NULL); | 145                 return (NULL); | 
| 146         } | 146         } | 
| 147 »       epollop->nfds = nfiles; | 147 »       epollop->nfds = INITIAL_NFILES; | 
| 148 | 148 | 
| 149         evsignal_init(base); | 149         evsignal_init(base); | 
| 150 | 150 | 
| 151         return (epollop); | 151         return (epollop); | 
| 152 } | 152 } | 
| 153 | 153 | 
| 154 static int | 154 static int | 
| 155 epoll_recalc(struct event_base *base, void *arg, int max) | 155 epoll_recalc(struct event_base *base, void *arg, int max) | 
| 156 { | 156 { | 
| 157         struct epollop *epollop = arg; | 157         struct epollop *epollop = arg; | 
| (...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 235 | 235 | 
| 236                 if (!(evread||evwrite)) | 236                 if (!(evread||evwrite)) | 
| 237                         continue; | 237                         continue; | 
| 238 | 238 | 
| 239                 if (evread != NULL) | 239                 if (evread != NULL) | 
| 240                         event_active(evread, EV_READ, 1); | 240                         event_active(evread, EV_READ, 1); | 
| 241                 if (evwrite != NULL) | 241                 if (evwrite != NULL) | 
| 242                         event_active(evwrite, EV_WRITE, 1); | 242                         event_active(evwrite, EV_WRITE, 1); | 
| 243         } | 243         } | 
| 244 | 244 | 
|  | 245         if (res == epollop->nevents && epollop->nevents < MAX_NEVENTS) { | 
|  | 246                 /* We used all of the event space this time.  We should | 
|  | 247                    be ready for more events next time. */ | 
|  | 248                 int new_nevents = epollop->nevents * 2; | 
|  | 249                 struct epoll_event *new_events; | 
|  | 250 | 
|  | 251                 new_events = realloc(epollop->events, | 
|  | 252                     new_nevents * sizeof(struct epoll_event)); | 
|  | 253                 if (new_events) { | 
|  | 254                         epollop->events = new_events; | 
|  | 255                         epollop->nevents = new_nevents; | 
|  | 256                 } | 
|  | 257         } | 
|  | 258 | 
| 245         return (0); | 259         return (0); | 
| 246 } | 260 } | 
| 247 | 261 | 
| 248 | 262 | 
| 249 static int | 263 static int | 
| 250 epoll_add(void *arg, struct event *ev) | 264 epoll_add(void *arg, struct event *ev) | 
| 251 { | 265 { | 
| 252         struct epollop *epollop = arg; | 266         struct epollop *epollop = arg; | 
| 253         struct epoll_event epev = {0, {0}}; | 267         struct epoll_event epev = {0, {0}}; | 
| 254         struct evepoll *evep; | 268         struct evepoll *evep; | 
| (...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 354         if (epollop->fds) | 368         if (epollop->fds) | 
| 355                 free(epollop->fds); | 369                 free(epollop->fds); | 
| 356         if (epollop->events) | 370         if (epollop->events) | 
| 357                 free(epollop->events); | 371                 free(epollop->events); | 
| 358         if (epollop->epfd >= 0) | 372         if (epollop->epfd >= 0) | 
| 359                 close(epollop->epfd); | 373                 close(epollop->epfd); | 
| 360 | 374 | 
| 361         memset(epollop, 0, sizeof(struct epollop)); | 375         memset(epollop, 0, sizeof(struct epollop)); | 
| 362         free(epollop); | 376         free(epollop); | 
| 363 } | 377 } | 
| OLD | NEW | 
|---|