From 54e4df33a23064c542eacd7f7e3598935d9c3100 Mon Sep 17 00:00:00 2001 From: Corinna Vinschen Date: Wed, 4 May 2011 13:06:10 +0000 Subject: [PATCH] * fhandler.h (class fhandler_base): Remove uninterruptible_io status flag. (fhandler_base::ready_for_read): Remove declaration. (fhandler_socket::ready_for_read): Ditto. (fhandler_pipe::ready_for_read): Ditto. (fhandler_tty_master::is_slow): Remove. * fhandler_console.cc (fhandler_console::open): Drop setting uninterruptible_io. * fhandler_serial.cc (fhandler_serial::open): Ditto. * fhandler_tty.cc (fhandler_tty_slave::fhandler_tty_slave): Ditto. (fhandler_tty_master::init_console): Ditto. * pipe.cc (fhandler_pipe::fhandler_pipe): Ditto. (fhandler_pipe::open): Ditto. (_pipe): Ditto. * select.cc (fhandler_pipe::ready_for_read): Remove. (fhandler_base::ready_for_read): Remove. * syscalls.cc (readv): Drop unneeded wait variable. Remove entire test which might lead to calling ready_for_read. Remove now unused label out. --- winsup/cygwin/ChangeLog | 22 ++++++++++++ winsup/cygwin/fhandler.h | 10 ++---- winsup/cygwin/fhandler_console.cc | 1 - winsup/cygwin/fhandler_serial.cc | 2 -- winsup/cygwin/fhandler_tty.cc | 5 +-- winsup/cygwin/pipe.cc | 3 -- winsup/cygwin/select.cc | 60 ------------------------------- winsup/cygwin/syscalls.cc | 14 ++------ 8 files changed, 27 insertions(+), 90 deletions(-) diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog index b8d5e1092..bf83619e4 100644 --- a/winsup/cygwin/ChangeLog +++ b/winsup/cygwin/ChangeLog @@ -1,3 +1,25 @@ +2011-05-04 Corinna Vinschen + + * fhandler.h (class fhandler_base): Remove uninterruptible_io status + flag. + (fhandler_base::ready_for_read): Remove declaration. + (fhandler_socket::ready_for_read): Ditto. + (fhandler_pipe::ready_for_read): Ditto. + (fhandler_tty_master::is_slow): Remove. + * fhandler_console.cc (fhandler_console::open): Drop setting + uninterruptible_io. + * fhandler_serial.cc (fhandler_serial::open): Ditto. + * fhandler_tty.cc (fhandler_tty_slave::fhandler_tty_slave): Ditto. + (fhandler_tty_master::init_console): Ditto. + * pipe.cc (fhandler_pipe::fhandler_pipe): Ditto. + (fhandler_pipe::open): Ditto. + (_pipe): Ditto. + * select.cc (fhandler_pipe::ready_for_read): Remove. + (fhandler_base::ready_for_read): Remove. + * syscalls.cc (readv): Drop unneeded wait variable. Remove entire test + which might lead to calling ready_for_read. Remove now unused label + out. + 2011-05-04 Corinna Vinschen * fhandler.h (class fhandler_mailslot): Move down in file and change diff --git a/winsup/cygwin/fhandler.h b/winsup/cygwin/fhandler.h index e4ef5cb4a..fc76c3f26 100644 --- a/winsup/cygwin/fhandler.h +++ b/winsup/cygwin/fhandler.h @@ -133,7 +133,6 @@ class fhandler_base unsigned wbinary : 1; /* binary write mode */ unsigned wbinset : 1; /* binary write mode explicitly set */ unsigned nohandle : 1; /* No handle associated with fhandler. */ - unsigned uninterruptible_io : 1; /* Set if I/O should be uninterruptible. */ unsigned did_lseek : 1; /* set when lseek is called as a flag that _write should check if we've moved beyond EOF, zero filling or making @@ -146,8 +145,8 @@ class fhandler_base public: status_flags () : rbinary (0), rbinset (0), wbinary (0), wbinset (0), nohandle (0), - uninterruptible_io (0), did_lseek (0), - query_open (no_query), close_on_exec (0), need_fork_fixup (0) + did_lseek (0), query_open (no_query), close_on_exec (0), + need_fork_fixup (0) {} } status, open_status; @@ -227,7 +226,6 @@ class fhandler_base IMPLEMENT_STATUS_FLAG (bool, wbinset) IMPLEMENT_STATUS_FLAG (bool, rbinset) IMPLEMENT_STATUS_FLAG (bool, nohandle) - IMPLEMENT_STATUS_FLAG (bool, uninterruptible_io) IMPLEMENT_STATUS_FLAG (bool, did_lseek) IMPLEMENT_STATUS_FLAG (query_state, query_open) IMPLEMENT_STATUS_FLAG (bool, close_on_exec) @@ -375,7 +373,6 @@ public: virtual select_record *select_read (select_stuff *); virtual select_record *select_write (select_stuff *); virtual select_record *select_except (select_stuff *); - virtual int ready_for_read (int fd, DWORD howlong); virtual const char *get_native_name () { return dev ().native; @@ -536,7 +533,6 @@ class fhandler_socket: public fhandler_base select_record *select_read (select_stuff *); select_record *select_write (select_stuff *); select_record *select_except (select_stuff *); - int ready_for_read (int, DWORD) { return true; } void set_addr_family (int af) {addr_family = af;} int get_addr_family () {return addr_family;} void set_socket_type (int st) { type = st;} @@ -615,7 +611,6 @@ public: int __stdcall fstatvfs (struct statvfs *buf) __attribute__ ((regparm (2))); int __stdcall fadvise (_off64_t, _off64_t, int) __attribute__ ((regparm (3))); int __stdcall ftruncate (_off64_t, bool) __attribute__ ((regparm (3))); - int ready_for_read (int fd, DWORD howlong); int init (HANDLE, DWORD, mode_t); static int create (fhandler_pipe *[2], unsigned, int); static int create_selectable (LPSECURITY_ATTRIBUTES, HANDLE&, HANDLE&, DWORD, const char * = NULL); @@ -1205,7 +1200,6 @@ class fhandler_tty_master: public fhandler_pty_master int init (); int init_console (); void set_winsize (bool); - bool is_slow () {return true;} }; class fhandler_dev_null: public fhandler_base diff --git a/winsup/cygwin/fhandler_console.cc b/winsup/cygwin/fhandler_console.cc index 464de322e..8a5ff1830 100644 --- a/winsup/cygwin/fhandler_console.cc +++ b/winsup/cygwin/fhandler_console.cc @@ -710,7 +710,6 @@ fhandler_console::open (int flags, mode_t) return 0; } set_io_handle (h); - uninterruptible_io (true); // Handled explicitly in read code h = CreateFile ("CONOUT$", GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, sec_none_cloexec (flags), diff --git a/winsup/cygwin/fhandler_serial.cc b/winsup/cygwin/fhandler_serial.cc index fd1870f58..f8c8ab5c6 100644 --- a/winsup/cygwin/fhandler_serial.cc +++ b/winsup/cygwin/fhandler_serial.cc @@ -246,8 +246,6 @@ fhandler_serial::open (int flags, mode_t mode) SetCommMask (get_handle (), EV_RXCHAR); - uninterruptible_io (true); // Handled explicitly in read code - overlapped_setup (); memset (&to, 0, sizeof (to)); diff --git a/winsup/cygwin/fhandler_tty.cc b/winsup/cygwin/fhandler_tty.cc index 6699cbe37..2eb430e14 100644 --- a/winsup/cygwin/fhandler_tty.cc +++ b/winsup/cygwin/fhandler_tty.cc @@ -456,9 +456,7 @@ process_ioctl (void *) fhandler_tty_slave::fhandler_tty_slave () : fhandler_tty_common (), inuse (NULL) -{ - uninterruptible_io (true); -} +{} /* FIXME: This function needs to close handles when it has a failing condition. */ @@ -1652,7 +1650,6 @@ fhandler_tty_master::init_console () console->init (NULL, GENERIC_READ | GENERIC_WRITE, O_BINARY); cygheap->manage_console_count ("fhandler_tty_master::init_console", -1, true); - console->uninterruptible_io (true); return 0; } diff --git a/winsup/cygwin/pipe.cc b/winsup/cygwin/pipe.cc index 2a44839f9..9fa52cd5e 100644 --- a/winsup/cygwin/pipe.cc +++ b/winsup/cygwin/pipe.cc @@ -28,7 +28,6 @@ fhandler_pipe::fhandler_pipe () { max_atomic_write = DEFAULT_PIPEBUFSIZE; need_fork_fixup (true); - uninterruptible_io (true); } int @@ -130,7 +129,6 @@ fhandler_pipe::open (int flags, mode_t mode) goto out; } init (nio_hdl, fh->get_access (), mode & O_TEXT ?: O_BINARY); - uninterruptible_io (fh->uninterruptible_io ()); cfree (fh); CloseHandle (proc); return 1; @@ -407,7 +405,6 @@ _pipe (int filedes[2], unsigned int psize, int mode) { cygheap_fdnew fdin; cygheap_fdnew fdout (fdin, false); - fhs[0]->uninterruptible_io (true); fdin = fhs[0]; fdout = fhs[1]; filedes[0] = fdin; diff --git a/winsup/cygwin/select.cc b/winsup/cygwin/select.cc index fd0281f50..92eabcf9c 100644 --- a/winsup/cygwin/select.cc +++ b/winsup/cygwin/select.cc @@ -694,17 +694,6 @@ pipe_cleanup (select_record *, select_stuff *stuff) stuff->device_specific_pipe = NULL; } -int -fhandler_pipe::ready_for_read (int fd, DWORD howlong) -{ - int res; - if (!howlong) - res = fhandler_base::ready_for_read (fd, howlong); - else - res = 1; - return res; -} - select_record * fhandler_pipe::select_read (select_stuff *ss) { @@ -1236,55 +1225,6 @@ fhandler_serial::select_except (select_stuff *ss) return s; } -int -fhandler_base::ready_for_read (int fd, DWORD howlong) -{ - bool avail = false; - - select_stuff sel; - fd_set *thisfd = allocfd_set (fd + 1); - fd_set *dummy_writefds = allocfd_set (fd + 1); - fd_set *dummy_exceptfds = allocfd_set (fd + 1); - UNIX_FD_SET(fd, thisfd); - - if (!sel.test_and_set (fd, thisfd, dummy_writefds, dummy_exceptfds)) - select_printf ("aborting due to test_and_set error"); - else - { - select_record *me = sel.start.next; - while (!avail) - { - avail = me->read_ready ?: me->peek (me, false); - - if (fd >= 0 && cygheap->fdtab.not_open (fd)) - { - set_sig_errno (EBADF); - avail = false; - break; - } - - if (howlong != INFINITE) - { - if (!avail) - set_sig_errno (EAGAIN); - break; - } - - if (WaitForSingleObject (signal_arrived, avail ? 0 : 10) == WAIT_OBJECT_0) - { - debug_printf ("interrupted"); - set_sig_errno (EINTR); - avail = false; - break; - } - } - } - - select_printf ("read_ready %d, avail %d", sel.start.next->read_ready, avail); - sel.cleanup (); - return avail; -} - select_record * fhandler_base::select_read (select_stuff *ss) { diff --git a/winsup/cygwin/syscalls.cc b/winsup/cygwin/syscalls.cc index ee5704095..93be3ec03 100644 --- a/winsup/cygwin/syscalls.cc +++ b/winsup/cygwin/syscalls.cc @@ -987,19 +987,10 @@ readv (int fd, const struct iovec *const iov, const int iovcnt) break; } - DWORD wait = cfd->is_nonblocking () ? 0 : INFINITE; - /* Could block, so let user know we at least got here. */ syscall_printf ("readv (%d, %p, %d) %sblocking, sigcatchers %d", - fd, iov, iovcnt, wait ? "" : "non", sigcatchers); - - if (wait && (!cfd->is_slow () || cfd->uninterruptible_io ())) - /* no need to call ready_for_read */; - else if (!cfd->ready_for_read (fd, wait)) - { - res = -1; - goto out; - } + fd, iov, iovcnt, cfd->is_nonblocking () ? "non" : "", + sigcatchers); /* FIXME: This is not thread safe. We need some method to ensure that an fd, closed in another thread, aborts I/O @@ -1029,7 +1020,6 @@ readv (int fd, const struct iovec *const iov, const int iovcnt) myself->process_state &= ~PID_TTYIN; } - out: if (res >= 0 || get_errno () != EINTR || !_my_tls.call_signal_handler ()) break; set_errno (e); -- 2.43.5