Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(135)

Side by Side Diff: third_party/libevent/epoll.c

Issue 412006: posix: upgrade libevent from 1.4.7 to 1.4.13 (Closed)
Patch Set: better readme Created 11 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
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
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 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698