* syscalls.cc (readv): Add myfault handler. Don't check repeatedly
open state of file handler. Streamline loop. (writev): Add myfault handler.
This commit is contained in:
parent
8ea8474947
commit
23db0a41d8
|
@ -1,3 +1,9 @@
|
||||||
|
2011-05-05 Corinna Vinschen <corinna@vinschen.de>
|
||||||
|
|
||||||
|
* syscalls.cc (readv): Add myfault handler. Don't check repeatedly
|
||||||
|
open state of file handler. Streamline loop.
|
||||||
|
(writev): Add myfault handler.
|
||||||
|
|
||||||
2011-05-05 Christopher Faylor <me.cygwin2011@cgf.cx>
|
2011-05-05 Christopher Faylor <me.cygwin2011@cgf.cx>
|
||||||
|
|
||||||
* fhandler.cc (fhandler_base_overlapped::raw_read): Rename from
|
* fhandler.cc (fhandler_base_overlapped::raw_read): Rename from
|
||||||
|
|
|
@ -962,60 +962,45 @@ readv (int fd, const struct iovec *const iov, const int iovcnt)
|
||||||
{
|
{
|
||||||
pthread_testcancel ();
|
pthread_testcancel ();
|
||||||
|
|
||||||
extern int sigcatchers;
|
myfault efault;
|
||||||
const int e = get_errno ();
|
if (efault.faulted (EFAULT))
|
||||||
|
return -1;
|
||||||
|
|
||||||
ssize_t res = -1;
|
ssize_t res = -1;
|
||||||
|
const int e = get_errno ();
|
||||||
const ssize_t tot = check_iovec_for_read (iov, iovcnt);
|
const ssize_t tot = check_iovec_for_read (iov, iovcnt);
|
||||||
|
|
||||||
|
cygheap_fdget cfd (fd);
|
||||||
|
if (cfd < 0)
|
||||||
|
goto done;
|
||||||
|
|
||||||
if (tot <= 0)
|
if (tot <= 0)
|
||||||
{
|
{
|
||||||
res = tot;
|
res = tot;
|
||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ((cfd->get_flags () & O_ACCMODE) == O_WRONLY)
|
||||||
|
{
|
||||||
|
set_errno (EBADF);
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Could block, so let user know we at least got here. */
|
||||||
|
extern int sigcatchers;
|
||||||
|
syscall_printf ("readv (%d, %p, %d) %sblocking, sigcatchers %d",
|
||||||
|
fd, iov, iovcnt, cfd->is_nonblocking () ? "non" : "",
|
||||||
|
sigcatchers);
|
||||||
|
|
||||||
while (1)
|
while (1)
|
||||||
{
|
{
|
||||||
cygheap_fdget cfd (fd);
|
|
||||||
if (cfd < 0)
|
|
||||||
break;
|
|
||||||
|
|
||||||
if ((cfd->get_flags () & O_ACCMODE) == O_WRONLY)
|
|
||||||
{
|
|
||||||
set_errno (EBADF);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Could block, so let user know we at least got here. */
|
|
||||||
syscall_printf ("readv (%d, %p, %d) %sblocking, sigcatchers %d",
|
|
||||||
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
|
|
||||||
operations. */
|
|
||||||
if (!cfd.isopen ())
|
|
||||||
break;
|
|
||||||
|
|
||||||
/* Check to see if this is a background read from a "tty",
|
/* Check to see if this is a background read from a "tty",
|
||||||
sending a SIGTTIN, if appropriate */
|
sending a SIGTTIN, if appropriate */
|
||||||
res = cfd->bg_check (SIGTTIN);
|
res = cfd->bg_check (SIGTTIN);
|
||||||
|
|
||||||
if (!cfd.isopen ())
|
|
||||||
{
|
|
||||||
res = -1;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (res > bg_eof)
|
if (res > bg_eof)
|
||||||
{
|
{
|
||||||
myself->process_state |= PID_TTYIN;
|
myself->process_state |= PID_TTYIN;
|
||||||
if (!cfd.isopen ())
|
|
||||||
{
|
|
||||||
res = -1;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
res = cfd->readv (iov, iovcnt, tot);
|
res = cfd->readv (iov, iovcnt, tot);
|
||||||
myself->process_state &= ~PID_TTYIN;
|
myself->process_state &= ~PID_TTYIN;
|
||||||
}
|
}
|
||||||
|
@ -1037,6 +1022,10 @@ writev (const int fd, const struct iovec *const iov, const int iovcnt)
|
||||||
{
|
{
|
||||||
pthread_testcancel ();
|
pthread_testcancel ();
|
||||||
|
|
||||||
|
myfault efault;
|
||||||
|
if (efault.faulted (EFAULT))
|
||||||
|
return -1;
|
||||||
|
|
||||||
int res = -1;
|
int res = -1;
|
||||||
const ssize_t tot = check_iovec_for_write (iov, iovcnt);
|
const ssize_t tot = check_iovec_for_write (iov, iovcnt);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue