Revert temporary commit in r79937

This commit is contained in:
Antoine Pitrou 2010-04-10 23:32:12 +00:00
parent 16e026cc94
commit bba8f2d10a
3 changed files with 21 additions and 99 deletions

View File

@ -2394,47 +2394,6 @@ class MiscIOTest(unittest.TestCase):
# baseline "io" module. # baseline "io" module.
self._check_abc_inheritance(io) self._check_abc_inheritance(io)
# Issue #5380: reading all available bytes from a pipe or a PTY when
# the other end has been closed.
def check_pipe_func(self, pipe_func, buffered):
master_fd, slave_fd = pipe_func()
# Simulate a subprocess writing some data to the
# slave end of the pipe, and then exiting.
data = b'TEST DATA'
try:
os.write(slave_fd, data)
finally:
os.close(slave_fd)
with self.open(master_fd, "rb", buffering=-1 if buffered else 0) as f:
# Request more data than available
gotdata = f.read(len(data) + 1)
self.assertEqual(gotdata, data)
# Trying to read again returns an empty string
self.assertEqual(b'', f.read())
self.assertEqual(b'', f.read(1))
def test_pipe_read_buffered(self):
if not hasattr(os, 'pipe'):
self.skipTest("os.pipe not available")
self.check_pipe_func(os.pipe, True)
def test_pipe_read_raw(self):
if not hasattr(os, 'pipe'):
self.skipTest("os.pipe not available")
self.check_pipe_func(os.pipe, False)
def test_openpty_read_buffered(self):
if not hasattr(os, 'openpty'):
self.skipTest("os.openpty not available")
self.check_pipe_func(os.openpty, True)
def test_openpty_read_raw(self):
if not hasattr(os, 'openpty'):
self.skipTest("os.openpty not available")
self.check_pipe_func(os.openpty, False)
class CMiscIOTest(MiscIOTest): class CMiscIOTest(MiscIOTest):
io = io io = io

View File

@ -280,29 +280,11 @@ class PosixTester(unittest.TestCase):
if hasattr(posix, 'strerror'): if hasattr(posix, 'strerror'):
self.assertTrue(posix.strerror(0)) self.assertTrue(posix.strerror(0))
def check_pipe_func(self, pipe_func):
master_fd, slave_fd = pipe_func()
try:
# Simulate a subprocess writing some data to the
# slave end of the pipe, and then exiting.
data = b'TEST DATA'
try:
os.write(slave_fd, data)
finally:
os.close(slave_fd)
# Request more data than available
gotdata = os.read(master_fd, len(data) + 1)
self.assertEqual(gotdata, data)
finally:
os.close(master_fd)
def test_pipe(self): def test_pipe(self):
if hasattr(posix, 'pipe'): if hasattr(posix, 'pipe'):
self.check_pipe_func(posix.pipe) reader, writer = posix.pipe()
os.close(reader)
def test_openpty(self): os.close(writer)
if hasattr(posix, 'openpty'):
self.check_pipe_func(posix.openpty)
def test_tempnam(self): def test_tempnam(self):
if hasattr(posix, 'tempnam'): if hasattr(posix, 'tempnam'):

View File

@ -464,34 +464,6 @@ fileio_seekable(fileio *self)
return PyBool_FromLong((long) self->seekable); return PyBool_FromLong((long) self->seekable);
} }
static Py_ssize_t
internal_read(int fd, void *buf, size_t count)
{
Py_ssize_t n;
Py_BEGIN_ALLOW_THREADS
errno = 0;
n = read(fd, buf, count);
#ifdef EIO
/* Issue #5380: when reading past the end of a pipe created by
openpty(), EIO can be set. Make it an EOF instead, so that
the normal technique of testing for an empty string can be used.
*/
if (n == -1 && errno == EIO) {
if (isatty(fd)) {
n = 0;
errno = 0;
}
else {
/* isatty() set errno, restore its value */
errno = EIO;
}
}
#endif
Py_END_ALLOW_THREADS
return n;
}
static PyObject * static PyObject *
fileio_readinto(fileio *self, PyObject *args) fileio_readinto(fileio *self, PyObject *args)
{ {
@ -506,9 +478,12 @@ fileio_readinto(fileio *self, PyObject *args)
if (!PyArg_ParseTuple(args, "w*", &pbuf)) if (!PyArg_ParseTuple(args, "w*", &pbuf))
return NULL; return NULL;
if (_PyVerify_fd(self->fd)) if (_PyVerify_fd(self->fd)) {
n = internal_read(self->fd, pbuf.buf, pbuf.len); Py_BEGIN_ALLOW_THREADS
else errno = 0;
n = read(self->fd, pbuf.buf, pbuf.len);
Py_END_ALLOW_THREADS
} else
n = -1; n = -1;
PyBuffer_Release(&pbuf); PyBuffer_Release(&pbuf);
if (n < 0) { if (n < 0) {
@ -585,9 +560,12 @@ fileio_readall(fileio *self)
break; break;
} }
} }
n = internal_read(self->fd, Py_BEGIN_ALLOW_THREADS
PyBytes_AS_STRING(result) + total, errno = 0;
newsize - total); n = read(self->fd,
PyBytes_AS_STRING(result) + total,
newsize - total);
Py_END_ALLOW_THREADS
if (n == 0) if (n == 0)
break; break;
if (n < 0) { if (n < 0) {
@ -639,9 +617,12 @@ fileio_read(fileio *self, PyObject *args)
return NULL; return NULL;
ptr = PyBytes_AS_STRING(bytes); ptr = PyBytes_AS_STRING(bytes);
if (_PyVerify_fd(self->fd)) if (_PyVerify_fd(self->fd)) {
n = internal_read(self->fd, ptr, size); Py_BEGIN_ALLOW_THREADS
else errno = 0;
n = read(self->fd, ptr, size);
Py_END_ALLOW_THREADS
} else
n = -1; n = -1;
if (n < 0) { if (n < 0) {