[newlib-cygwin] Cygwin: fhandler_socket: Move select functions into derived classes
Corinna Vinschen
corinna@sourceware.org
Thu Feb 22 16:01:00 GMT 2018
https://sourceware.org/git/gitweb.cgi?p=newlib-cygwin.git;h=b8a57a2d2a13887ef7e7b60bbc3b9666bab64c71
commit b8a57a2d2a13887ef7e7b60bbc3b9666bab64c71
Author: Corinna Vinschen <corinna@vinschen.de>
Date: Thu Feb 22 16:59:55 2018 +0100
Cygwin: fhandler_socket: Move select functions into derived classes
Signed-off-by: Corinna Vinschen <corinna@vinschen.de>
Diff:
---
winsup/cygwin/fhandler.h | 18 ++++++++++++---
winsup/cygwin/select.cc | 60 +++++++++++++++++++++++++++++++++++++++++++++---
2 files changed, 72 insertions(+), 6 deletions(-)
diff --git a/winsup/cygwin/fhandler.h b/winsup/cygwin/fhandler.h
index 1915608..79991bd 100644
--- a/winsup/cygwin/fhandler.h
+++ b/winsup/cygwin/fhandler.h
@@ -625,13 +625,15 @@ class fhandler_socket: public fhandler_base
void hclose (HANDLE) {close ();}
- select_record *select_read (select_stuff *);
- select_record *select_write (select_stuff *);
- select_record *select_except (select_stuff *);
void set_addr_family (int af) {addr_family = af;}
int get_addr_family () {return addr_family;}
void set_socket_type (int st) { type = st;}
int get_socket_type () {return type;}
+
+ /* select.cc */
+ virtual select_record *select_read (select_stuff *) = 0;
+ virtual select_record *select_write (select_stuff *) = 0;
+ virtual select_record *select_except (select_stuff *) = 0;
};
class fhandler_socket_inet: public fhandler_socket
@@ -674,6 +676,11 @@ class fhandler_socket_inet: public fhandler_socket
int ioctl (unsigned int cmd, void *);
int fcntl (int cmd, intptr_t);
+ /* select.cc */
+ select_record *select_read (select_stuff *);
+ select_record *select_write (select_stuff *);
+ select_record *select_except (select_stuff *);
+
/* from here on: CLONING */
fhandler_socket_inet (void *) {}
@@ -772,6 +779,11 @@ class fhandler_socket_local: public fhandler_socket
int __reg3 facl (int, int, struct acl *);
int __reg2 link (const char *);
+ /* select.cc */
+ select_record *select_read (select_stuff *);
+ select_record *select_write (select_stuff *);
+ select_record *select_except (select_stuff *);
+
/* from here on: CLONING */
fhandler_socket_local (void *) {}
diff --git a/winsup/cygwin/select.cc b/winsup/cygwin/select.cc
index ca2cd5a..86e7cd8 100644
--- a/winsup/cygwin/select.cc
+++ b/winsup/cygwin/select.cc
@@ -1549,7 +1549,7 @@ socket_cleanup (select_record *, select_stuff *stuff)
}
select_record *
-fhandler_socket::select_read (select_stuff *ss)
+fhandler_socket_inet::select_read (select_stuff *ss)
{
select_record *s = ss->start.next;
if (!s->startup)
@@ -1565,7 +1565,7 @@ fhandler_socket::select_read (select_stuff *ss)
}
select_record *
-fhandler_socket::select_write (select_stuff *ss)
+fhandler_socket_inet::select_write (select_stuff *ss)
{
select_record *s = ss->start.next;
if (!s->startup)
@@ -1586,7 +1586,61 @@ fhandler_socket::select_write (select_stuff *ss)
}
select_record *
-fhandler_socket::select_except (select_stuff *ss)
+fhandler_socket_inet::select_except (select_stuff *ss)
+{
+ select_record *s = ss->start.next;
+ if (!s->startup)
+ {
+ s->startup = start_thread_socket;
+ s->verify = verify_true;
+ s->cleanup = socket_cleanup;
+ }
+ s->peek = peek_socket;
+ /* FIXME: Is this right? Should these be used as criteria for except? */
+ s->except_ready = saw_shutdown_write () || saw_shutdown_read ();
+ s->except_selected = true;
+ return s;
+}
+
+select_record *
+fhandler_socket_local::select_read (select_stuff *ss)
+{
+ select_record *s = ss->start.next;
+ if (!s->startup)
+ {
+ s->startup = start_thread_socket;
+ s->verify = verify_true;
+ s->cleanup = socket_cleanup;
+ }
+ s->peek = peek_socket;
+ s->read_ready = saw_shutdown_read ();
+ s->read_selected = true;
+ return s;
+}
+
+select_record *
+fhandler_socket_local::select_write (select_stuff *ss)
+{
+ select_record *s = ss->start.next;
+ if (!s->startup)
+ {
+ s->startup = start_thread_socket;
+ s->verify = verify_true;
+ s->cleanup = socket_cleanup;
+ }
+ s->peek = peek_socket;
+ s->write_ready = saw_shutdown_write () || connect_state () == unconnected;
+ s->write_selected = true;
+ if (connect_state () != unconnected)
+ {
+ s->except_ready = saw_shutdown_write () || saw_shutdown_read ();
+ s->except_on_write = true;
+ }
+ return s;
+}
+
+select_record *
+fhandler_socket_local::select_except (select_stuff *ss)
{
select_record *s = ss->start.next;
if (!s->startup)
More information about the Cygwin-cvs
mailing list