2 * OpenVPN -- An application to securely tunnel IP networks
3 * over a single TCP/UDP port, with support for SSL/TLS-based
4 * session authentication and key exchange,
5 * packet encryption, packet authentication, and
8 * Copyright (C) 2002-2010 OpenVPN Technologies, Inc. <sales@openvpn.net>
10 * This program is free software; you can redistribute it and/or modify
11 * it under the terms of the GNU General Public License version 2
12 * as published by the Free Software Foundation.
14 * This program is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 * GNU General Public License for more details.
19 * You should have received a copy of the GNU General Public License
20 * along with this program (see the file COPYING included with this
21 * distribution); if not, write to the Free Software Foundation, Inc.,
22 * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
27 #elif defined(_MSC_VER)
28 #include "config-msvc.h"
42 * Some OSes will prefer select() over poll()
43 * when both are available.
45 #if defined(TARGET_DARWIN)
46 #define SELECT_PREFERRED_OVER_POLL
50 * All non-windows OSes are assumed to have select()
59 * This should be set to the highest file descriptor
60 * which can be used in one of the FD_ macros.
63 #define SELECT_MAX_FDS FD_SETSIZE
65 #define SELECT_MAX_FDS 256
69 tv_to_ms_timeout (const struct timeval
*tv
)
71 if (tv
->tv_sec
== 0 && tv
->tv_usec
== 0)
74 return max_int (tv
->tv_sec
* 1000 + (tv
->tv_usec
+ 500) / 1000, 1);
81 struct event_set_functions func
;
84 struct event_set_return
*esr
;
90 we_set_event (struct we_set
*wes
, int i
, event_t event
, unsigned int rwflags
, void *arg
)
92 ASSERT (i
>= 0 && i
< wes
->capacity
);
94 if (rwflags
== EVENT_READ
)
96 ASSERT (event
->read
!= NULL
);
97 wes
->events
[i
] = event
->read
;
99 else if (rwflags
== EVENT_WRITE
)
101 ASSERT (event
->write
!= NULL
);
102 wes
->events
[i
] = event
->write
;
105 msg (M_FATAL
, "fatal error in we_set_events: rwflags=%d", rwflags
);
107 wes
->esr
[i
].rwflags
= rwflags
;
108 wes
->esr
[i
].arg
= arg
;
112 we_append_event (struct we_set
*wes
, event_t event
, unsigned int rwflags
, void *arg
)
114 if (rwflags
& EVENT_WRITE
)
116 if (wes
->n_events
< wes
->capacity
)
118 we_set_event (wes
, wes
->n_events
, event
, EVENT_WRITE
, arg
);
124 if (rwflags
& EVENT_READ
)
126 if (wes
->n_events
< wes
->capacity
)
128 we_set_event (wes
, wes
->n_events
, event
, EVENT_READ
, arg
);
138 we_del_event (struct we_set
*wes
, event_t event
)
141 const int len
= wes
->n_events
;
143 for (i
= 0; i
< len
; ++i
)
145 const HANDLE h
= wes
->events
[i
];
146 if (h
== event
->read
|| h
== event
->write
)
152 wes
->events
[j
] = wes
->events
[i
];
153 wes
->esr
[j
] = wes
->esr
[i
];
161 we_del_index (struct we_set
*wes
, int index
)
164 ASSERT (index
>= 0 && index
< wes
->n_events
);
165 for (i
= index
; i
< wes
->n_events
- 1; ++i
)
167 wes
->events
[i
] = wes
->events
[i
+1];
168 wes
->esr
[i
] = wes
->esr
[i
+1];
174 we_get_rw_indices (struct we_set
*wes
, event_t event
, int *ri
, int *wi
)
178 for (i
= 0; i
< wes
->n_events
; ++i
)
180 const HANDLE h
= wes
->events
[i
];
181 if (h
== event
->read
)
186 else if (h
== event
->write
)
195 we_free (struct event_set
*es
)
197 struct we_set
*wes
= (struct we_set
*) es
;
204 we_reset (struct event_set
*es
)
206 struct we_set
*wes
= (struct we_set
*) es
;
212 we_del (struct event_set
*es
, event_t event
)
214 struct we_set
*wes
= (struct we_set
*) es
;
216 we_del_event (wes
, event
);
220 we_ctl (struct event_set
*es
, event_t event
, unsigned int rwflags
, void *arg
)
222 struct we_set
*wes
= (struct we_set
*) es
;
224 dmsg (D_EVENT_WAIT
, "WE_CTL n=%d ev=%p rwflags=0x%04x arg=" ptr_format
,
232 if (!we_append_event (wes
, event
, rwflags
, arg
))
241 we_get_rw_indices (wes
, event
, &ri
, &wi
);
260 we_del_index (wes
, one
);
263 we_del_event (wes
, event
);
273 if (!we_append_event (wes
, event
, EVENT_READ
, arg
))
277 we_set_event (wes
, one
, event
, EVENT_READ
, arg
);
280 we_del_index (wes
, wi
);
290 if (!we_append_event (wes
, event
, EVENT_WRITE
, arg
))
294 we_set_event (wes
, one
, event
, EVENT_WRITE
, arg
);
297 we_del_index (wes
, ri
);
303 case EVENT_READ
|EVENT_WRITE
:
307 if (!we_append_event (wes
, event
, EVENT_READ
|EVENT_WRITE
, arg
))
314 if (!we_append_event (wes
, event
, EVENT_READ
, arg
))
319 if (!we_append_event (wes
, event
, EVENT_WRITE
, arg
))
332 msg (M_FATAL
, "fatal error in we_ctl: rwflags=%d", rwflags
);
338 msg (D_EVENT_ERRORS
, "Error: Windows resource limit WSA_MAXIMUM_WAIT_EVENTS (%d) has been exceeded", WSA_MAXIMUM_WAIT_EVENTS
);
342 we_wait (struct event_set
*es
, const struct timeval
*tv
, struct event_set_return
*out
, int outlen
)
344 struct we_set
*wes
= (struct we_set
*) es
;
345 const int timeout
= tv_to_ms_timeout (tv
);
348 dmsg (D_EVENT_WAIT
, "WE_WAIT enter n=%d to=%d", wes
->n_events
, timeout
);
351 if (check_debug_level (D_EVENT_WAIT
)) {
353 for (i
= 0; i
< wes
->n_events
; ++i
)
354 dmsg (D_EVENT_WAIT
, "[%d] ev=%p rwflags=0x%04x arg=" ptr_format
,
358 (ptr_type
)wes
->esr
[i
].arg
);
363 * First poll our event list with 0 timeout
365 status
= WSAWaitForMultipleEvents(
366 (DWORD
) wes
->n_events
,
373 * If at least one event is already set, we must
374 * individually poll the whole list.
376 if (status
>= WSA_WAIT_EVENT_0
&& status
< WSA_WAIT_EVENT_0
+ (DWORD
) wes
->n_events
)
380 for (i
= 0; i
< wes
->n_events
; ++i
)
384 if (WaitForSingleObject (wes
->events
[i
], 0) == WAIT_OBJECT_0
)
387 dmsg (D_EVENT_WAIT
, "WE_WAIT leave [%d,%d] rwflags=0x%04x arg=" ptr_format
,
388 i
, j
, out
->rwflags
, (ptr_type
)out
->arg
);
398 * If caller specified timeout > 0, we know at this point
399 * that no events are set, so wait only for the first event
400 * (or timeout) and return at most one event_set_return object.
402 * If caller specified timeout == 0, the second call to
403 * WSAWaitForMultipleEvents would be redundant -- just
404 * return 0 indicating timeout.
407 status
= WSAWaitForMultipleEvents(
408 (DWORD
) wes
->n_events
,
414 if (outlen
>= 1 && status
>= WSA_WAIT_EVENT_0
&& status
< WSA_WAIT_EVENT_0
+ (DWORD
) wes
->n_events
)
416 *out
= wes
->esr
[status
- WSA_WAIT_EVENT_0
];
417 dmsg (D_EVENT_WAIT
, "WE_WAIT leave rwflags=0x%04x arg=" ptr_format
,
418 out
->rwflags
, (ptr_type
)out
->arg
);
421 else if (status
== WSA_WAIT_TIMEOUT
)
428 static struct event_set
*
429 we_init (int *maxevents
, unsigned int flags
)
433 dmsg (D_EVENT_WAIT
, "WE_INIT maxevents=%d flags=0x%08x", *maxevents
, flags
);
435 ALLOC_OBJ_CLEAR (wes
, struct we_set
);
437 /* set dispatch functions */
438 wes
->func
.free
= we_free
;
439 wes
->func
.reset
= we_reset
;
440 wes
->func
.del
= we_del
;
441 wes
->func
.ctl
= we_ctl
;
442 wes
->func
.wait
= we_wait
;
444 if (flags
& EVENT_METHOD_FAST
)
448 /* Figure our event capacity */
449 ASSERT (*maxevents
> 0);
450 wes
->capacity
= min_int (*maxevents
* 2, WSA_MAXIMUM_WAIT_EVENTS
);
451 *maxevents
= min_int (*maxevents
, WSA_MAXIMUM_WAIT_EVENTS
);
453 /* Allocate space for Win32 event handles */
454 ALLOC_ARRAY_CLEAR (wes
->events
, HANDLE
, wes
->capacity
);
456 /* Allocate space for event_set_return objects */
457 ALLOC_ARRAY_CLEAR (wes
->esr
, struct event_set_return
, wes
->capacity
);
459 dmsg (D_EVENT_WAIT
, "WE_INIT maxevents=%d capacity=%d",
460 *maxevents
, wes
->capacity
);
462 return (struct event_set
*) wes
;
471 struct event_set_functions func
;
475 struct epoll_event
*events
;
479 ep_free (struct event_set
*es
)
481 struct ep_set
*eps
= (struct ep_set
*) es
;
488 ep_reset (struct event_set
*es
)
490 const struct ep_set
*eps
= (struct ep_set
*) es
;
495 ep_del (struct event_set
*es
, event_t event
)
497 struct epoll_event ev
;
498 struct ep_set
*eps
= (struct ep_set
*) es
;
500 dmsg (D_EVENT_WAIT
, "EP_DEL ev=%d", (int)event
);
504 epoll_ctl (eps
->epfd
, EPOLL_CTL_DEL
, event
, &ev
);
508 ep_ctl (struct event_set
*es
, event_t event
, unsigned int rwflags
, void *arg
)
510 struct ep_set
*eps
= (struct ep_set
*) es
;
511 struct epoll_event ev
;
516 if (rwflags
& EVENT_READ
)
517 ev
.events
|= EPOLLIN
;
518 if (rwflags
& EVENT_WRITE
)
519 ev
.events
|= EPOLLOUT
;
521 dmsg (D_EVENT_WAIT
, "EP_CTL fd=%d rwflags=0x%04x ev=0x%08x arg=" ptr_format
,
524 (unsigned int)ev
.events
,
525 (ptr_type
)ev
.data
.ptr
);
527 if (epoll_ctl (eps
->epfd
, EPOLL_CTL_MOD
, event
, &ev
) < 0)
531 if (epoll_ctl (eps
->epfd
, EPOLL_CTL_ADD
, event
, &ev
) < 0)
532 msg (M_ERR
, "EVENT: epoll_ctl EPOLL_CTL_ADD failed, sd=%d", (int)event
);
535 msg (M_ERR
, "EVENT: epoll_ctl EPOLL_CTL_MOD failed, sd=%d", (int)event
);
540 ep_wait (struct event_set
*es
, const struct timeval
*tv
, struct event_set_return
*out
, int outlen
)
542 struct ep_set
*eps
= (struct ep_set
*) es
;
545 if (outlen
> eps
->maxevents
)
546 outlen
= eps
->maxevents
;
548 stat
= epoll_wait (eps
->epfd
, eps
->events
, outlen
, tv_to_ms_timeout (tv
));
549 ASSERT (stat
<= outlen
);
554 const struct epoll_event
*ev
= eps
->events
;
555 struct event_set_return
*esr
= out
;
556 for (i
= 0; i
< stat
; ++i
)
559 if (ev
->events
& (EPOLLIN
|EPOLLPRI
|EPOLLERR
|EPOLLHUP
))
560 esr
->rwflags
|= EVENT_READ
;
561 if (ev
->events
& EPOLLOUT
)
562 esr
->rwflags
|= EVENT_WRITE
;
563 esr
->arg
= ev
->data
.ptr
;
564 dmsg (D_EVENT_WAIT
, "EP_WAIT[%d] rwflags=0x%04x ev=0x%08x arg=" ptr_format
,
565 i
, esr
->rwflags
, ev
->events
, (ptr_type
)ev
->data
.ptr
);
573 static struct event_set
*
574 ep_init (int *maxevents
, unsigned int flags
)
579 dmsg (D_EVENT_WAIT
, "EP_INIT maxevents=%d flags=0x%08x", *maxevents
, flags
);
581 /* open epoll file descriptor */
582 fd
= epoll_create (*maxevents
);
588 ALLOC_OBJ_CLEAR (eps
, struct ep_set
);
590 /* set dispatch functions */
591 eps
->func
.free
= ep_free
;
592 eps
->func
.reset
= ep_reset
;
593 eps
->func
.del
= ep_del
;
594 eps
->func
.ctl
= ep_ctl
;
595 eps
->func
.wait
= ep_wait
;
597 /* fast method ("sort of") corresponds to epoll one-shot */
598 if (flags
& EVENT_METHOD_FAST
)
601 /* allocate space for epoll_wait return */
602 ASSERT (*maxevents
> 0);
603 eps
->maxevents
= *maxevents
;
604 ALLOC_ARRAY_CLEAR (eps
->events
, struct epoll_event
, eps
->maxevents
);
606 /* set epoll control fd */
609 return (struct event_set
*) eps
;
617 struct event_set_functions func
;
619 struct pollfd
*events
;
626 po_free (struct event_set
*es
)
628 struct po_set
*pos
= (struct po_set
*) es
;
635 po_reset (struct event_set
*es
)
637 struct po_set
*pos
= (struct po_set
*) es
;
643 po_del (struct event_set
*es
, event_t event
)
645 struct po_set
*pos
= (struct po_set
*) es
;
648 dmsg (D_EVENT_WAIT
, "PO_DEL ev=%d", (int)event
);
651 for (i
= 0; i
< pos
->n_events
; ++i
)
653 if (pos
->events
[i
].fd
== event
)
656 for (j
= i
; j
< pos
->n_events
- 1; ++j
)
658 pos
->events
[j
] = pos
->events
[j
+1];
659 pos
->args
[j
] = pos
->args
[j
+1];
668 po_set_pollfd_events (struct pollfd
*pfdp
, unsigned int rwflags
)
671 if (rwflags
& EVENT_WRITE
)
672 pfdp
->events
|= POLLOUT
;
673 if (rwflags
& EVENT_READ
)
674 pfdp
->events
|= (POLLIN
|POLLPRI
);
678 po_append_event (struct po_set
*pos
, event_t event
, unsigned int rwflags
, void *arg
)
680 if (pos
->n_events
< pos
->capacity
)
682 struct pollfd
*pfdp
= &pos
->events
[pos
->n_events
];
684 pos
->args
[pos
->n_events
] = arg
;
685 po_set_pollfd_events (pfdp
, rwflags
);
694 po_ctl (struct event_set
*es
, event_t event
, unsigned int rwflags
, void *arg
)
696 struct po_set
*pos
= (struct po_set
*) es
;
698 dmsg (D_EVENT_WAIT
, "PO_CTL rwflags=0x%04x ev=%d arg=" ptr_format
,
699 rwflags
, (int)event
, (ptr_type
)arg
);
703 if (!po_append_event (pos
, event
, rwflags
, arg
))
709 for (i
= 0; i
< pos
->n_events
; ++i
)
711 struct pollfd
*pfdp
= &pos
->events
[i
];
712 if (pfdp
->fd
== event
)
715 po_set_pollfd_events (pfdp
, rwflags
);
719 if (!po_append_event (pos
, event
, rwflags
, arg
))
727 msg (D_EVENT_ERRORS
, "Error: poll: too many I/O wait events");
731 po_wait (struct event_set
*es
, const struct timeval
*tv
, struct event_set_return
*out
, int outlen
)
733 struct po_set
*pos
= (struct po_set
*) es
;
736 stat
= poll (pos
->events
, pos
->n_events
, tv_to_ms_timeout (tv
));
738 ASSERT (stat
<= pos
->n_events
);
743 const struct pollfd
*pfdp
= pos
->events
;
744 for (i
= 0; i
< pos
->n_events
&& j
< outlen
; ++i
)
746 if (pfdp
->revents
& (POLLIN
|POLLPRI
|POLLERR
|POLLHUP
|POLLOUT
))
749 if (pfdp
->revents
& (POLLIN
|POLLPRI
|POLLERR
|POLLHUP
))
750 out
->rwflags
|= EVENT_READ
;
751 if (pfdp
->revents
& POLLOUT
)
752 out
->rwflags
|= EVENT_WRITE
;
753 out
->arg
= pos
->args
[i
];
754 dmsg (D_EVENT_WAIT
, "PO_WAIT[%d,%d] fd=%d rev=0x%08x rwflags=0x%04x arg=" ptr_format
" %s",
755 i
, j
, pfdp
->fd
, pfdp
->revents
, out
->rwflags
, (ptr_type
)out
->arg
, pos
->fast
? "" : "[scalable]");
759 else if (pfdp
->revents
)
761 msg (D_EVENT_ERRORS
, "Error: poll: unknown revents=0x%04x", (unsigned int)pfdp
->revents
);
770 static struct event_set
*
771 po_init (int *maxevents
, unsigned int flags
)
775 dmsg (D_EVENT_WAIT
, "PO_INIT maxevents=%d flags=0x%08x", *maxevents
, flags
);
777 ALLOC_OBJ_CLEAR (pos
, struct po_set
);
779 /* set dispatch functions */
780 pos
->func
.free
= po_free
;
781 pos
->func
.reset
= po_reset
;
782 pos
->func
.del
= po_del
;
783 pos
->func
.ctl
= po_ctl
;
784 pos
->func
.wait
= po_wait
;
786 if (flags
& EVENT_METHOD_FAST
)
791 /* Figure our event capacity */
792 ASSERT (*maxevents
> 0);
793 pos
->capacity
= *maxevents
;
795 /* Allocate space for pollfd structures to be passed to poll() */
796 ALLOC_ARRAY_CLEAR (pos
->events
, struct pollfd
, pos
->capacity
);
798 /* Allocate space for event_set_return objects */
799 ALLOC_ARRAY_CLEAR (pos
->args
, void *, pos
->capacity
);
801 return (struct event_set
*) pos
;
809 struct event_set_functions func
;
813 void **args
; /* allocated to capacity size */
814 int maxfd
; /* largest fd seen so far, always < capacity */
815 int capacity
; /* fixed largest fd + 1 */
819 se_free (struct event_set
*es
)
821 struct se_set
*ses
= (struct se_set
*) es
;
827 se_reset (struct event_set
*es
)
829 struct se_set
*ses
= (struct se_set
*) es
;
833 dmsg (D_EVENT_WAIT
, "SE_RESET");
835 FD_ZERO (&ses
->readfds
);
836 FD_ZERO (&ses
->writefds
);
837 for (i
= 0; i
<= ses
->maxfd
; ++i
)
843 se_del (struct event_set
*es
, event_t event
)
845 struct se_set
*ses
= (struct se_set
*) es
;
848 dmsg (D_EVENT_WAIT
, "SE_DEL ev=%d", (int)event
);
850 if (event
>= 0 && event
< ses
->capacity
)
852 FD_CLR (event
, &ses
->readfds
);
853 FD_CLR (event
, &ses
->writefds
);
854 ses
->args
[event
] = NULL
;
857 msg (D_EVENT_ERRORS
, "Error: select/se_del: too many I/O wait events");
862 se_ctl (struct event_set
*es
, event_t event
, unsigned int rwflags
, void *arg
)
864 struct se_set
*ses
= (struct se_set
*) es
;
866 dmsg (D_EVENT_WAIT
, "SE_CTL rwflags=0x%04x ev=%d fast=%d cap=%d maxfd=%d arg=" ptr_format
,
867 rwflags
, (int)event
, (int)ses
->fast
, ses
->capacity
, ses
->maxfd
, (ptr_type
)arg
);
869 if (event
>= 0 && event
< ses
->capacity
)
871 ses
->maxfd
= max_int (event
, ses
->maxfd
);
872 ses
->args
[event
] = arg
;
875 if (rwflags
& EVENT_READ
)
876 FD_SET (event
, &ses
->readfds
);
877 if (rwflags
& EVENT_WRITE
)
878 FD_SET (event
, &ses
->writefds
);
882 if (rwflags
& EVENT_READ
)
883 FD_SET (event
, &ses
->readfds
);
885 FD_CLR (event
, &ses
->readfds
);
886 if (rwflags
& EVENT_WRITE
)
887 FD_SET (event
, &ses
->writefds
);
889 FD_CLR (event
, &ses
->writefds
);
894 msg (D_EVENT_ERRORS
, "Error: select: too many I/O wait events, fd=%d cap=%d",
901 se_wait_return (struct se_set
*ses
,
904 struct event_set_return
*out
,
908 for (i
= 0; i
<= ses
->maxfd
&& j
< outlen
; ++i
)
910 const bool r
= FD_ISSET (i
, read
);
911 const bool w
= FD_ISSET (i
, write
);
916 out
->rwflags
|= EVENT_READ
;
918 out
->rwflags
|= EVENT_WRITE
;
919 out
->arg
= ses
->args
[i
];
920 dmsg (D_EVENT_WAIT
, "SE_WAIT[%d,%d] rwflags=0x%04x arg=" ptr_format
,
921 i
, j
, out
->rwflags
, (ptr_type
)out
->arg
);
930 se_wait_fast (struct event_set
*es
, const struct timeval
*tv
, struct event_set_return
*out
, int outlen
)
932 struct se_set
*ses
= (struct se_set
*) es
;
933 struct timeval tv_tmp
= *tv
;
936 dmsg (D_EVENT_WAIT
, "SE_WAIT_FAST maxfd=%d tv=%d/%d",
939 (int)tv_tmp
.tv_usec
);
941 stat
= select (ses
->maxfd
+ 1, &ses
->readfds
, &ses
->writefds
, NULL
, &tv_tmp
);
944 stat
= se_wait_return (ses
, &ses
->readfds
, &ses
->writefds
, out
, outlen
);
950 se_wait_scalable (struct event_set
*es
, const struct timeval
*tv
, struct event_set_return
*out
, int outlen
)
952 struct se_set
*ses
= (struct se_set
*) es
;
953 struct timeval tv_tmp
= *tv
;
954 fd_set read
= ses
->readfds
;
955 fd_set write
= ses
->writefds
;
958 dmsg (D_EVENT_WAIT
, "SE_WAIT_SCALEABLE maxfd=%d tv=%d/%d",
959 ses
->maxfd
, (int)tv_tmp
.tv_sec
, (int)tv_tmp
.tv_usec
);
961 stat
= select (ses
->maxfd
+ 1, &read
, &write
, NULL
, &tv_tmp
);
964 stat
= se_wait_return (ses
, &read
, &write
, out
, outlen
);
969 static struct event_set
*
970 se_init (int *maxevents
, unsigned int flags
)
974 dmsg (D_EVENT_WAIT
, "SE_INIT maxevents=%d flags=0x%08x", *maxevents
, flags
);
976 ALLOC_OBJ_CLEAR (ses
, struct se_set
);
978 /* set dispatch functions */
979 ses
->func
.free
= se_free
;
980 ses
->func
.reset
= se_reset
;
981 ses
->func
.del
= se_del
;
982 ses
->func
.ctl
= se_ctl
;
983 ses
->func
.wait
= se_wait_scalable
;
985 if (flags
& EVENT_METHOD_FAST
)
988 ses
->func
.wait
= se_wait_fast
;
991 /* Select needs to be passed this value + 1 */
994 /* Set our event capacity */
995 ASSERT (*maxevents
> 0);
996 *maxevents
= min_int (*maxevents
, SELECT_MAX_FDS
);
997 ses
->capacity
= SELECT_MAX_FDS
;
999 /* Allocate space for event_set_return void * args */
1000 ALLOC_ARRAY_CLEAR (ses
->args
, void *, ses
->capacity
);
1002 return (struct event_set
*) ses
;
1006 static struct event_set
*
1007 event_set_init_simple (int *maxevents
, unsigned int flags
)
1009 struct event_set
*ret
= NULL
;
1011 ret
= we_init (maxevents
, flags
);
1012 #elif POLL && SELECT
1013 #if 0 /* Define to 1 if EVENT_METHOD_US_TIMEOUT should cause select to be favored over poll */
1014 if (flags
& EVENT_METHOD_US_TIMEOUT
)
1015 ret
= se_init (maxevents
, flags
);
1017 # ifdef SELECT_PREFERRED_OVER_POLL
1019 ret
= se_init (maxevents
, flags
);
1021 ret
= po_init (maxevents
, flags
);
1024 ret
= po_init (maxevents
, flags
);
1026 ret
= se_init (maxevents
, flags
);
1029 ret
= po_init (maxevents
, flags
);
1031 ret
= se_init (maxevents
, flags
);
1033 #error At least one of poll, select, or WSAWaitForMultipleEvents must be supported by the kernel
1039 static struct event_set
*
1040 event_set_init_scalable (int *maxevents
, unsigned int flags
)
1042 struct event_set
*ret
= NULL
;
1044 ret
= ep_init (maxevents
, flags
);
1047 msg (M_WARN
, "Note: sys_epoll API is unavailable, falling back to poll/select API");
1048 ret
= event_set_init_simple (maxevents
, flags
);
1051 ret
= event_set_init_simple (maxevents
, flags
);
1058 event_set_init (int *maxevents
, unsigned int flags
)
1060 if (flags
& EVENT_METHOD_FAST
)
1061 return event_set_init_simple (maxevents
, flags
);
1063 return event_set_init_scalable (maxevents
, flags
);