2
0
mirror of https://github.com/openvswitch/ovs synced 2025-08-31 06:15:47 +00:00

poll-loop: Port to Windows.

Use WaitForMultipleObjects for polling on windows.  This works on all kinds
of objects, e.g. sockets, files, especially ioctl calls to the kernel.
poll_fd_wait_event() is used if events need to be passed to pollfds.  latch
is signaled with event, to be waited/polled by WaitForMultipleObjects() as
well.  Changed array of fds to hmap to check for duplicate fds.

Signed-off-by: Linda Sun <lsun@vmware.com>
Signed-off-by: Ben Pfaff <blp@nicira.com>
This commit is contained in:
Linda Sun
2014-01-09 16:26:12 -08:00
committed by Ben Pfaff
parent d103f479c6
commit 4ca828d713
9 changed files with 231 additions and 42 deletions

View File

@@ -1,5 +1,5 @@
/*
* Copyright (c) 2008, 2009, 2010, 2011, 2012, 2013 Nicira, Inc.
* Copyright (c) 2008, 2009, 2010, 2011, 2012, 2013, 2014 Nicira, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -232,12 +232,12 @@ time_alarm(unsigned int secs)
*
* Stores the number of milliseconds elapsed during poll in '*elapsed'. */
int
time_poll(struct pollfd *pollfds, int n_pollfds, long long int timeout_when,
int *elapsed)
time_poll(struct pollfd *pollfds, int n_pollfds, HANDLE *handles OVS_UNUSED,
long long int timeout_when, int *elapsed)
{
long long int *last_wakeup = last_wakeup_get();
long long int start;
int retval;
int retval = 0;
time_init();
coverage_clear();
@@ -261,10 +261,25 @@ time_poll(struct pollfd *pollfds, int n_pollfds, long long int timeout_when,
time_left = timeout_when - now;
}
#ifndef _WIN32
retval = poll(pollfds, n_pollfds, time_left);
if (retval < 0) {
retval = -errno;
}
#else
if (n_pollfds > MAXIMUM_WAIT_OBJECTS) {
VLOG_ERR("Cannot handle more than maximum wait objects\n");
} else if (n_pollfds != 0) {
retval = WaitForMultipleObjects(n_pollfds, handles, FALSE,
time_left);
}
if (retval < 0) {
/* XXX This will be replace by a win error to errno
conversion function */
retval = -WSAGetLastError();
retval = -EINVAL;
}
#endif
if (deadline <= time_msec()) {
fatal_signal_handler(SIGALRM);