ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/libev/ev_select.c
(Generate patch)

Comparing libev/ev_select.c (file contents):
Revision 1.50 by root, Sun Jan 30 19:05:41 2011 UTC vs.
Revision 1.58 by root, Sat Aug 17 05:30:16 2019 UTC

1/* 1/*
2 * libev select fd activity backend 2 * libev select fd activity backend
3 * 3 *
4 * Copyright (c) 2007,2008,2009,2010 Marc Alexander Lehmann <libev@schmorp.de> 4 * Copyright (c) 2007,2008,2009,2010,2011 Marc Alexander Lehmann <libev@schmorp.de>
5 * All rights reserved. 5 * All rights reserved.
6 * 6 *
7 * Redistribution and use in source and binary forms, with or without modifica- 7 * Redistribution and use in source and binary forms, with or without modifica-
8 * tion, are permitted provided that the following conditions are met: 8 * tion, are permitted provided that the following conditions are met:
9 * 9 *
10 * 1. Redistributions of source code must retain the above copyright notice, 10 * 1. Redistributions of source code must retain the above copyright notice,
11 * this list of conditions and the following disclaimer. 11 * this list of conditions and the following disclaimer.
12 * 12 *
13 * 2. Redistributions in binary form must reproduce the above copyright 13 * 2. Redistributions in binary form must reproduce the above copyright
14 * notice, this list of conditions and the following disclaimer in the 14 * notice, this list of conditions and the following disclaimer in the
15 * documentation and/or other materials provided with the distribution. 15 * documentation and/or other materials provided with the distribution.
16 * 16 *
17 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED 17 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
18 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MER- 18 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MER-
19 * CHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO 19 * CHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
20 * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPE- 20 * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPE-
21 * CIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 21 * CIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
40#ifndef _WIN32 40#ifndef _WIN32
41/* for unix systems */ 41/* for unix systems */
42# include <inttypes.h> 42# include <inttypes.h>
43# ifndef __hpux 43# ifndef __hpux
44/* for REAL unix systems */ 44/* for REAL unix systems */
45# include <sys/select.h> 45# include <sys/select.h>
46# endif 46# endif
47#endif 47#endif
48 48
49#ifndef EV_SELECT_USE_FD_SET 49#ifndef EV_SELECT_USE_FD_SET
50# ifdef NFDBITS 50# ifdef NFDBITS
106#else 106#else
107 107
108 int word = fd / NFDBITS; 108 int word = fd / NFDBITS;
109 fd_mask mask = 1UL << (fd % NFDBITS); 109 fd_mask mask = 1UL << (fd % NFDBITS);
110 110
111 if (expect_false (vec_max <= word)) 111 if (ecb_expect_false (vec_max <= word))
112 { 112 {
113 int new_max = word + 1; 113 int new_max = word + 1;
114 114
115 vec_ri = ev_realloc (vec_ri, new_max * NFDBYTES); 115 vec_ri = ev_realloc (vec_ri, new_max * NFDBYTES);
116 vec_ro = ev_realloc (vec_ro, new_max * NFDBYTES); /* could free/malloc */ 116 vec_ro = ev_realloc (vec_ro, new_max * NFDBYTES); /* could free/malloc */
169#else 169#else
170 res = select (vec_max * NFDBITS, (fd_set *)vec_ro, (fd_set *)vec_wo, 0, &tv); 170 res = select (vec_max * NFDBITS, (fd_set *)vec_ro, (fd_set *)vec_wo, 0, &tv);
171#endif 171#endif
172 EV_ACQUIRE_CB; 172 EV_ACQUIRE_CB;
173 173
174 if (expect_false (res < 0)) 174 if (ecb_expect_false (res < 0))
175 { 175 {
176 #if EV_SELECT_IS_WINSOCKET 176 #if EV_SELECT_IS_WINSOCKET
177 errno = WSAGetLastError (); 177 errno = WSAGetLastError ();
178 #endif 178 #endif
179 #ifdef WSABASEERR 179 #ifdef WSABASEERR
193 * we also get EINVAL when the timeout is invalid, but we ignore this case here 193 * we also get EINVAL when the timeout is invalid, but we ignore this case here
194 * and assume that EINVAL always means: you have to wait manually. 194 * and assume that EINVAL always means: you have to wait manually.
195 */ 195 */
196 if (errno == EINVAL) 196 if (errno == EINVAL)
197 { 197 {
198 ev_sleep (timeout); 198 if (timeout)
199 {
200 unsigned long ms = EV_TS_TO_MSEC (timeout);
201 Sleep (ms ? ms : 1);
202 }
203
199 return; 204 return;
200 } 205 }
201 #endif 206 #endif
202 207
203 if (errno == EBADF) 208 if (errno == EBADF)
229 if (FD_ISSET (handle, (fd_set *)vec_wo)) events |= EV_WRITE; 234 if (FD_ISSET (handle, (fd_set *)vec_wo)) events |= EV_WRITE;
230 #ifdef _WIN32 235 #ifdef _WIN32
231 if (FD_ISSET (handle, (fd_set *)vec_eo)) events |= EV_WRITE; 236 if (FD_ISSET (handle, (fd_set *)vec_eo)) events |= EV_WRITE;
232 #endif 237 #endif
233 238
234 if (expect_true (events)) 239 if (ecb_expect_true (events))
235 fd_event (EV_A_ fd, events); 240 fd_event (EV_A_ fd, events);
236 } 241 }
237 } 242 }
238 243
239#else 244#else
255 int events = 0; 260 int events = 0;
256 261
257 events |= word_r & mask ? EV_READ : 0; 262 events |= word_r & mask ? EV_READ : 0;
258 events |= word_w & mask ? EV_WRITE : 0; 263 events |= word_w & mask ? EV_WRITE : 0;
259 264
260 if (expect_true (events)) 265 if (ecb_expect_true (events))
261 fd_event (EV_A_ word * NFDBITS + bit, events); 266 fd_event (EV_A_ word * NFDBITS + bit, events);
262 } 267 }
263 } 268 }
264 } 269 }
265 270
266#endif 271#endif
267} 272}
268 273
269int inline_size 274inline_size
275int
270select_init (EV_P_ int flags) 276select_init (EV_P_ int flags)
271{ 277{
272 backend_fudge = 0.; /* posix says this is zero */ 278 backend_mintime = EV_TS_CONST (1e-6);
273 backend_modify = select_modify; 279 backend_modify = select_modify;
274 backend_poll = select_poll; 280 backend_poll = select_poll;
275 281
276#if EV_SELECT_USE_FD_SET 282#if EV_SELECT_USE_FD_SET
277 vec_ri = ev_malloc (sizeof (fd_set)); FD_ZERO ((fd_set *)vec_ri); 283 vec_ri = ev_malloc (sizeof (fd_set)); FD_ZERO ((fd_set *)vec_ri);
278 vec_ro = ev_malloc (sizeof (fd_set)); 284 vec_ro = ev_malloc (sizeof (fd_set));
279 vec_wi = ev_malloc (sizeof (fd_set)); FD_ZERO ((fd_set *)vec_wi); 285 vec_wi = ev_malloc (sizeof (fd_set)); FD_ZERO ((fd_set *)vec_wi);
281 #ifdef _WIN32 287 #ifdef _WIN32
282 vec_eo = ev_malloc (sizeof (fd_set)); 288 vec_eo = ev_malloc (sizeof (fd_set));
283 #endif 289 #endif
284#else 290#else
285 vec_max = 0; 291 vec_max = 0;
286 vec_ri = 0; 292 vec_ri = 0;
287 vec_ro = 0; 293 vec_ro = 0;
288 vec_wi = 0; 294 vec_wi = 0;
289 vec_wo = 0; 295 vec_wo = 0;
290 #ifdef _WIN32 296 #ifdef _WIN32
291 vec_eo = 0; 297 vec_eo = 0;
292 #endif 298 #endif
293#endif 299#endif
294 300
295 return EVBACKEND_SELECT; 301 return EVBACKEND_SELECT;
296} 302}
297 303
298void inline_size 304inline_size
305void
299select_destroy (EV_P) 306select_destroy (EV_P)
300{ 307{
301 ev_free (vec_ri); 308 ev_free (vec_ri);
302 ev_free (vec_ro); 309 ev_free (vec_ro);
303 ev_free (vec_wi); 310 ev_free (vec_wi);
305 #ifdef _WIN32 312 #ifdef _WIN32
306 ev_free (vec_eo); 313 ev_free (vec_eo);
307 #endif 314 #endif
308} 315}
309 316
310

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines