| 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 76 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» 32000 | 97 #define NEVENT» 32 |
| 98 | 98 |
| 99 /* On Linux kernels at least up to 2.6.24.4, epoll can't handle timeout | 99 /* 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 | 100 * 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 | 101 * 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 | 102 * largest number of msec we can support here is 2147482. Let's |
| 103 * round that down by 47 seconds. | 103 * round that down by 47 seconds. |
| 104 */ | 104 */ |
| 105 #define MAX_EPOLL_TIMEOUT_MSEC (35*60*1000) | 105 #define MAX_EPOLL_TIMEOUT_MSEC (35*60*1000) |
| 106 | 106 |
| 107 static void * | 107 static void * |
| 108 epoll_init(struct event_base *base) | 108 epoll_init(struct event_base *base) |
| 109 { | 109 { |
| 110 int epfd, nfiles = NEVENT; | 110 int epfd, nfiles = NEVENT; |
| 111 struct rlimit rl; | 111 struct rlimit rl; |
| 112 struct epollop *epollop; | 112 struct epollop *epollop; |
| 113 | 113 |
| 114 /* Disable epollueue when this environment variable is set */ | 114 /* Disable epollueue when this environment variable is set */ |
| 115 if (getenv("EVENT_NOEPOLL")) | 115 if (getenv("EVENT_NOEPOLL")) |
| 116 return (NULL); | 116 return (NULL); |
| 117 | 117 |
| 118 if (getrlimit(RLIMIT_NOFILE, &rl) == 0 && | |
| 119 rl.rlim_cur != RLIM_INFINITY) { | |
| 120 /* | |
| 121 * Solaris is somewhat retarded - it's important to drop | |
| 122 * backwards compatibility when making changes. So, don't | |
| 123 * dare to put rl.rlim_cur here. | |
| 124 */ | |
| 125 nfiles = rl.rlim_cur - 1; | |
| 126 } | |
| 127 | |
| 128 /* Initalize the kernel queue */ | 118 /* Initalize the kernel queue */ |
| 129 | 119 |
| 130 if ((epfd = epoll_create(nfiles)) == -1) { | 120 if ((epfd = epoll_create(nfiles)) == -1) { |
| 131 if (errno != ENOSYS) | 121 if (errno != ENOSYS) |
| 132 event_warn("epoll_create"); | 122 event_warn("epoll_create"); |
| 133 return (NULL); | 123 return (NULL); |
| 134 } | 124 } |
| 135 | 125 |
| 136 FD_CLOSEONEXEC(epfd); | 126 FD_CLOSEONEXEC(epfd); |
| 137 | 127 |
| (...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 219 evsignal_process(base); | 209 evsignal_process(base); |
| 220 } | 210 } |
| 221 | 211 |
| 222 event_debug(("%s: epoll_wait reports %d", __func__, res)); | 212 event_debug(("%s: epoll_wait reports %d", __func__, res)); |
| 223 | 213 |
| 224 for (i = 0; i < res; i++) { | 214 for (i = 0; i < res; i++) { |
| 225 int what = events[i].events; | 215 int what = events[i].events; |
| 226 struct event *evread = NULL, *evwrite = NULL; | 216 struct event *evread = NULL, *evwrite = NULL; |
| 227 int fd = events[i].data.fd; | 217 int fd = events[i].data.fd; |
| 228 | 218 |
| 229 » » if (fd < 0 && fd >= epollop->nfds) | 219 » » if (fd < 0 || fd >= epollop->nfds) |
| 230 continue; | 220 continue; |
| 231 evep = &epollop->fds[fd]; | 221 evep = &epollop->fds[fd]; |
| 232 | 222 |
| 233 if (what & (EPOLLHUP|EPOLLERR)) { | 223 if (what & (EPOLLHUP|EPOLLERR)) { |
| 234 evread = evep->evread; | 224 evread = evep->evread; |
| 235 evwrite = evep->evwrite; | 225 evwrite = evep->evwrite; |
| 236 } else { | 226 } else { |
| 237 if (what & EPOLLIN) { | 227 if (what & EPOLLIN) { |
| 238 evread = evep->evread; | 228 evread = evep->evread; |
| 239 } | 229 } |
| (...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 364 if (epollop->fds) | 354 if (epollop->fds) |
| 365 free(epollop->fds); | 355 free(epollop->fds); |
| 366 if (epollop->events) | 356 if (epollop->events) |
| 367 free(epollop->events); | 357 free(epollop->events); |
| 368 if (epollop->epfd >= 0) | 358 if (epollop->epfd >= 0) |
| 369 close(epollop->epfd); | 359 close(epollop->epfd); |
| 370 | 360 |
| 371 memset(epollop, 0, sizeof(struct epollop)); | 361 memset(epollop, 0, sizeof(struct epollop)); |
| 372 free(epollop); | 362 free(epollop); |
| 373 } | 363 } |
| OLD | NEW |