diff options
author | Corinna Vinschen <corinna@vinschen.de> | 2002-07-05 18:26:23 +0000 |
---|---|---|
committer | Corinna Vinschen <corinna@vinschen.de> | 2002-07-05 18:26:23 +0000 |
commit | d5591d9df67a1425a8c05f22cbde430c4a93627f (patch) | |
tree | 96201f8ba2ad69fb41b3dd47a170d65c62f59fd5 /winsup/cygwin/select.cc | |
parent | 89ffbd66e7747dd3719b1252e4037805385c8237 (diff) | |
download | cygnal-d5591d9df67a1425a8c05f22cbde430c4a93627f.tar.gz cygnal-d5591d9df67a1425a8c05f22cbde430c4a93627f.tar.bz2 cygnal-d5591d9df67a1425a8c05f22cbde430c4a93627f.zip |
* fhandler.h (UNCONNECTED): New define.
(CONNECT_PENDING): Ditto.
(CONNECTED): Ditto.
(class fhandler_socket): Add member `had_connect_or_listen'.
Add member functions `is_unconnected', `is_connect_pending' and
`is_connected'.
* fhandler_socket.cc (fhandler_socket::connect): Set member
`had_connect_or_listen' according to return code of WinSock
call.
(fhandler_socket::listen): Ditto.
* net.cc (cygwin_getsockopt): Modify SO_ERROR return value in
case of socket with pending connect().
* select.cc (peek_socket): Only add socket to matching fd_set
if it's not "ready". Call WINSOCK_SELECT only if at least one
socket is in one of the fd_sets.
(start_thread_socket): Only add socket to matching fd_set
if it's not "ready".
(fhandler_socket::select_write): Set write_ready to true also
if socket isn't connected or listening.
Diffstat (limited to 'winsup/cygwin/select.cc')
-rw-r--r-- | winsup/cygwin/select.cc | 45 |
1 files changed, 25 insertions, 20 deletions
diff --git a/winsup/cygwin/select.cc b/winsup/cygwin/select.cc index b50ffb1f2..46f0c6963 100644 --- a/winsup/cygwin/select.cc +++ b/winsup/cygwin/select.cc @@ -1180,39 +1180,44 @@ peek_socket (select_record *me, bool) set_handle_or_return_if_not_open (h, me); select_printf ("considering handle %p", h); - if (me->read_selected) + if (me->read_selected && !me->read_ready) { select_printf ("adding read fd_set %s, fd %d", me->fh->get_name (), me->fd); WINSOCK_FD_SET (h, &ws_readfds); } - if (me->write_selected) + if (me->write_selected && !me->write_ready) { select_printf ("adding write fd_set %s, fd %d", me->fh->get_name (), me->fd); WINSOCK_FD_SET (h, &ws_writefds); } - if (me->except_selected) + if (me->except_selected && !me->except_ready) { select_printf ("adding except fd_set %s, fd %d", me->fh->get_name (), me->fd); WINSOCK_FD_SET (h, &ws_exceptfds); } - int r = WINSOCK_SELECT (0, &ws_readfds, &ws_writefds, &ws_exceptfds, &tv); - select_printf ("WINSOCK_SELECT returned %d", r); - if (r == -1) + int r; + if ((me->read_selected && !me->read_ready) + || (me->write_selected && !me->write_ready) + || (me->except_selected && !me->except_ready)) { - select_printf ("error %d", WSAGetLastError ()); - set_winsock_errno (); - return 0; + r = WINSOCK_SELECT (0, &ws_readfds, &ws_writefds, &ws_exceptfds, &tv); + select_printf ("WINSOCK_SELECT returned %d", r); + if (r == -1) + { + select_printf ("error %d", WSAGetLastError ()); + set_winsock_errno (); + return 0; + } + if (WINSOCK_FD_ISSET (h, &ws_readfds) || (me->read_selected && me->read_ready)) + me->read_ready = true; + if (WINSOCK_FD_ISSET (h, &ws_writefds) || (me->write_selected && me->write_ready)) + me->write_ready = true; + if (WINSOCK_FD_ISSET (h, &ws_exceptfds) || (me->except_selected && me->except_ready)) + me->except_ready = true; } - - if (WINSOCK_FD_ISSET (h, &ws_readfds) || (me->read_selected && me->read_ready)) - me->read_ready = true; - if (WINSOCK_FD_ISSET (h, &ws_writefds) || (me->write_selected && me->write_ready)) - me->write_ready = true; - if (WINSOCK_FD_ISSET (h, &ws_exceptfds) || (me->except_selected && me->except_ready)) - me->except_ready = true; return me->read_ready || me->write_ready || me->except_ready; } @@ -1280,17 +1285,17 @@ start_thread_socket (select_record *me, select_stuff *stuff) { HANDLE h = s->fh->get_handle (); select_printf ("Handle %p", h); - if (s->read_selected) + if (s->read_selected && !s->read_ready) { WINSOCK_FD_SET (h, &si->readfds); select_printf ("Added to readfds"); } - if (s->write_selected) + if (s->write_selected && !s->write_ready) { WINSOCK_FD_SET (h, &si->writefds); select_printf ("Added to writefds"); } - if (s->except_selected) + if (s->except_selected && !s->except_ready) { WINSOCK_FD_SET (h, &si->exceptfds); select_printf ("Added to exceptfds"); @@ -1410,7 +1415,7 @@ fhandler_socket::select_write (select_record *s) s->cleanup = socket_cleanup; } s->peek = peek_socket; - s->write_ready = saw_shutdown_write (); + s->write_ready = saw_shutdown_write () || !is_connected (); s->write_selected = true; return s; } |