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

Side by Side Diff: native_client_sdk/src/libraries/nacl_io/kernel_proxy.cc

Issue 229863002: [NaCl SDK] nacl_io: Fix select() implementation so it doesn't assume entire fs_sets. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 years, 8 months 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 | Annotate | Revision Log
« no previous file with comments | « no previous file | native_client_sdk/src/tests/nacl_io_test/event_test.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "nacl_io/kernel_proxy.h" 5 #include "nacl_io/kernel_proxy.h"
6 6
7 #include <assert.h> 7 #include <assert.h>
8 #include <errno.h> 8 #include <errno.h>
9 #include <fcntl.h> 9 #include <fcntl.h>
10 #include <limits.h> 10 #include <limits.h>
(...skipping 1011 matching lines...) Expand 10 before | Expand all | Expand 10 after
1022 1022
1023 // Unknown signum 1023 // Unknown signum
1024 errno = EINVAL; 1024 errno = EINVAL;
1025 return -1; 1025 return -1;
1026 } 1026 }
1027 1027
1028 #ifdef PROVIDES_SOCKET_API 1028 #ifdef PROVIDES_SOCKET_API
1029 1029
1030 int KernelProxy::select(int nfds, fd_set* readfds, fd_set* writefds, 1030 int KernelProxy::select(int nfds, fd_set* readfds, fd_set* writefds,
1031 fd_set* exceptfds, struct timeval* timeout) { 1031 fd_set* exceptfds, struct timeval* timeout) {
1032 fd_set ignore;
1033 std::vector<pollfd> pollfds; 1032 std::vector<pollfd> pollfds;
1034 1033
1035 // Simplify logic, by using an IGNORE set for any undefined set
1036 FD_ZERO(&ignore);
1037 if (NULL == readfds)
1038 readfds = &ignore;
1039 if (NULL == writefds)
1040 writefds = &ignore;
1041 if (NULL == exceptfds)
1042 exceptfds = &ignore;
1043
1044 for (int fd = 0; fd < nfds; fd++) { 1034 for (int fd = 0; fd < nfds; fd++) {
1045 int events = 0; 1035 int events = 0;
1046 if (FD_ISSET(fd, readfds)) 1036 if (readfds && FD_ISSET(fd, readfds)) {
1047 events |= POLLIN; 1037 events |= POLLIN;
1038 FD_CLR(fd, readfds);
1039 }
1048 1040
1049 if (FD_ISSET(fd, writefds)) 1041 if (writefds && FD_ISSET(fd, writefds)) {
1050 events |= POLLOUT; 1042 events |= POLLOUT;
1043 FD_CLR(fd, writefds);
1044 }
1051 1045
1052 if (FD_ISSET(fd, exceptfds)) 1046 if (exceptfds && FD_ISSET(fd, exceptfds)) {
1053 events |= POLLERR | POLLHUP; 1047 events |= POLLERR | POLLHUP;
1048 FD_CLR(fd, exceptfds);
1049 }
1054 1050
1055 if (events) { 1051 if (events) {
1056 pollfd info; 1052 pollfd info;
1057 info.fd = fd; 1053 info.fd = fd;
1058 info.events = events; 1054 info.events = events;
1059 pollfds.push_back(info); 1055 pollfds.push_back(info);
1060 } 1056 }
1061 } 1057 }
1062 1058
1063 FD_ZERO(readfds);
1064 FD_ZERO(writefds);
1065 FD_ZERO(exceptfds);
1066
1067 // NULL timeout signals wait forever. 1059 // NULL timeout signals wait forever.
1068 int ms_timeout = -1; 1060 int ms_timeout = -1;
1069 if (timeout != NULL) { 1061 if (timeout != NULL) {
1070 int64_t ms = timeout->tv_sec * 1000 + ((timeout->tv_usec + 500) / 1000); 1062 int64_t ms = timeout->tv_sec * 1000 + ((timeout->tv_usec + 500) / 1000);
1071 1063
1072 // If the timeout is invalid or too long (larger than signed 32 bit). 1064 // If the timeout is invalid or too long (larger than signed 32 bit).
1073 if ((timeout->tv_sec < 0) || (timeout->tv_sec >= (INT_MAX / 1000)) || 1065 if ((timeout->tv_sec < 0) || (timeout->tv_sec >= (INT_MAX / 1000)) ||
1074 (timeout->tv_usec < 0) || (timeout->tv_usec >= 1000000) || 1066 (timeout->tv_usec < 0) || (timeout->tv_usec >= 1000000) ||
1075 (ms < 0) || (ms >= INT_MAX)) { 1067 (ms < 0) || (ms >= INT_MAX)) {
1076 errno = EINVAL; 1068 errno = EINVAL;
(...skipping 567 matching lines...) Expand 10 before | Expand all | Expand 10 after
1644 errno = ENOTSOCK; 1636 errno = ENOTSOCK;
1645 return -1; 1637 return -1;
1646 } 1638 }
1647 1639
1648 return 0; 1640 return 0;
1649 } 1641 }
1650 1642
1651 #endif // PROVIDES_SOCKET_API 1643 #endif // PROVIDES_SOCKET_API
1652 1644
1653 } // namespace_nacl_io 1645 } // namespace_nacl_io
OLDNEW
« no previous file with comments | « no previous file | native_client_sdk/src/tests/nacl_io_test/event_test.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698