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

Side by Side Diff: third_party/libevent/select.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 /* $OpenBSD: select.c,v 1.2 2002/06/25 15:50:15 mickey Exp $ */ 1 /* $OpenBSD: select.c,v 1.2 2002/06/25 15:50:15 mickey Exp $ */
2 2
3 /* 3 /*
4 * Copyright 2000-2002 Niels Provos <provos@citi.umich.edu> 4 * Copyright 2000-2002 Niels Provos <provos@citi.umich.edu>
5 * All rights reserved. 5 * All rights reserved.
6 * 6 *
7 * Redistribution and use in source and binary forms, with or without 7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions 8 * modification, are permitted provided that the following conditions
9 * are met: 9 * are met:
10 * 1. Redistributions of source code must retain the above copyright 10 * 1. Redistributions of source code must retain the above copyright
(...skipping 16 matching lines...) Expand all
27 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28 */ 28 */
29 #ifdef HAVE_CONFIG_H 29 #ifdef HAVE_CONFIG_H
30 #include "config.h" 30 #include "config.h"
31 #endif 31 #endif
32 32
33 #include <sys/types.h> 33 #include <sys/types.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 #ifdef HAVE_SYS_SELECT_H 39 #ifdef HAVE_SYS_SELECT_H
40 #include <sys/select.h> 40 #include <sys/select.h>
41 #endif 41 #endif
42 #include <sys/queue.h> 42 #include <sys/queue.h>
43 #include <signal.h> 43 #include <signal.h>
44 #include <stdio.h> 44 #include <stdio.h>
45 #include <stdlib.h> 45 #include <stdlib.h>
46 #include <string.h> 46 #include <string.h>
47 #include <unistd.h> 47 #include <unistd.h>
48 #include <errno.h> 48 #include <errno.h>
49 #ifdef CHECK_INVARIANTS 49 #ifdef CHECK_INVARIANTS
50 #include <assert.h> 50 #include <assert.h>
51 #endif 51 #endif
52 52
53 #include "event.h" 53 #include "event.h"
54 #include "evutil.h"
54 #include "event-internal.h" 55 #include "event-internal.h"
55 #include "evsignal.h" 56 #include "evsignal.h"
56 #include "log.h" 57 #include "log.h"
57 58
58 #ifndef howmany 59 #ifndef howmany
59 #define howmany(x, y) (((x)+((y)-1))/(y)) 60 #define howmany(x, y) (((x)+((y)-1))/(y))
60 #endif 61 #endif
61 62
63 #ifndef _EVENT_HAVE_FD_MASK
64 /* This type is mandatory, but Android doesn't define it. */
65 #undef NFDBITS
66 #define NFDBITS (sizeof(long)*8)
67 typedef unsigned long fd_mask;
68 #endif
69
62 struct selectop { 70 struct selectop {
63 int event_fds; /* Highest fd in fd set */ 71 int event_fds; /* Highest fd in fd set */
64 int event_fdsz; 72 int event_fdsz;
65 fd_set *event_readset_in; 73 fd_set *event_readset_in;
66 fd_set *event_writeset_in; 74 fd_set *event_writeset_in;
67 fd_set *event_readset_out; 75 fd_set *event_readset_out;
68 fd_set *event_writeset_out; 76 fd_set *event_writeset_out;
69 struct event **event_r_by_fd; 77 struct event **event_r_by_fd;
70 struct event **event_w_by_fd; 78 struct event **event_w_by_fd;
71 }; 79 };
(...skipping 15 matching lines...) Expand all
87 }; 95 };
88 96
89 static int select_resize(struct selectop *sop, int fdsz); 97 static int select_resize(struct selectop *sop, int fdsz);
90 98
91 static void * 99 static void *
92 select_init(struct event_base *base) 100 select_init(struct event_base *base)
93 { 101 {
94 struct selectop *sop; 102 struct selectop *sop;
95 103
96 /* Disable select when this environment variable is set */ 104 /* Disable select when this environment variable is set */
97 » if (getenv("EVENT_NOSELECT")) 105 » if (evutil_getenv("EVENT_NOSELECT"))
98 return (NULL); 106 return (NULL);
99 107
100 if (!(sop = calloc(1, sizeof(struct selectop)))) 108 if (!(sop = calloc(1, sizeof(struct selectop))))
101 return (NULL); 109 return (NULL);
102 110
103 select_resize(sop, howmany(32 + 1, NFDBITS)*sizeof(fd_mask)); 111 select_resize(sop, howmany(32 + 1, NFDBITS)*sizeof(fd_mask));
104 112
105 evsignal_init(base); 113 evsignal_init(base);
106 114
107 return (sop); 115 return (sop);
(...skipping 22 matching lines...) Expand all
130 } 138 }
131 139
132 } 140 }
133 #else 141 #else
134 #define check_selectop(sop) do { (void) sop; } while (0) 142 #define check_selectop(sop) do { (void) sop; } while (0)
135 #endif 143 #endif
136 144
137 static int 145 static int
138 select_dispatch(struct event_base *base, void *arg, struct timeval *tv) 146 select_dispatch(struct event_base *base, void *arg, struct timeval *tv)
139 { 147 {
140 » int res, i; 148 » int res, i, j;
141 struct selectop *sop = arg; 149 struct selectop *sop = arg;
142 150
143 check_selectop(sop); 151 check_selectop(sop);
144 152
145 memcpy(sop->event_readset_out, sop->event_readset_in, 153 memcpy(sop->event_readset_out, sop->event_readset_in,
146 sop->event_fdsz); 154 sop->event_fdsz);
147 memcpy(sop->event_writeset_out, sop->event_writeset_in, 155 memcpy(sop->event_writeset_out, sop->event_writeset_in,
148 sop->event_fdsz); 156 sop->event_fdsz);
149 157
150 res = select(sop->event_fds + 1, sop->event_readset_out, 158 res = select(sop->event_fds + 1, sop->event_readset_out,
151 sop->event_writeset_out, NULL, tv); 159 sop->event_writeset_out, NULL, tv);
152 160
153 check_selectop(sop); 161 check_selectop(sop);
154 162
155 if (res == -1) { 163 if (res == -1) {
156 if (errno != EINTR) { 164 if (errno != EINTR) {
157 event_warn("select"); 165 event_warn("select");
158 return (-1); 166 return (-1);
159 } 167 }
160 168
161 evsignal_process(base); 169 evsignal_process(base);
162 return (0); 170 return (0);
163 } else if (base->sig.evsignal_caught) { 171 } else if (base->sig.evsignal_caught) {
164 evsignal_process(base); 172 evsignal_process(base);
165 } 173 }
166 174
167 event_debug(("%s: select reports %d", __func__, res)); 175 event_debug(("%s: select reports %d", __func__, res));
168 176
169 check_selectop(sop); 177 check_selectop(sop);
170 » for (i = 0; i <= sop->event_fds; ++i) { 178 » i = random() % (sop->event_fds+1);
179 » for (j = 0; j <= sop->event_fds; ++j) {
171 struct event *r_ev = NULL, *w_ev = NULL; 180 struct event *r_ev = NULL, *w_ev = NULL;
181 if (++i >= sop->event_fds+1)
182 i = 0;
183
172 res = 0; 184 res = 0;
173 if (FD_ISSET(i, sop->event_readset_out)) { 185 if (FD_ISSET(i, sop->event_readset_out)) {
174 r_ev = sop->event_r_by_fd[i]; 186 r_ev = sop->event_r_by_fd[i];
175 res |= EV_READ; 187 res |= EV_READ;
176 } 188 }
177 if (FD_ISSET(i, sop->event_writeset_out)) { 189 if (FD_ISSET(i, sop->event_writeset_out)) {
178 w_ev = sop->event_w_by_fd[i]; 190 w_ev = sop->event_w_by_fd[i];
179 res |= EV_WRITE; 191 res |= EV_WRITE;
180 } 192 }
181 if (r_ev && (res & r_ev->ev_events)) { 193 if (r_ev && (res & r_ev->ev_events)) {
(...skipping 161 matching lines...) Expand 10 before | Expand all | Expand 10 after
343 if (sop->event_writeset_out) 355 if (sop->event_writeset_out)
344 free(sop->event_writeset_out); 356 free(sop->event_writeset_out);
345 if (sop->event_r_by_fd) 357 if (sop->event_r_by_fd)
346 free(sop->event_r_by_fd); 358 free(sop->event_r_by_fd);
347 if (sop->event_w_by_fd) 359 if (sop->event_w_by_fd)
348 free(sop->event_w_by_fd); 360 free(sop->event_w_by_fd);
349 361
350 memset(sop, 0, sizeof(struct selectop)); 362 memset(sop, 0, sizeof(struct selectop));
351 free(sop); 363 free(sop);
352 } 364 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698