Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
C
cpython
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kirill Smelkov
cpython
Commits
f85384bc
Commit
f85384bc
authored
9 years ago
by
Serhiy Storchaka
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Issue #21802: The reader in BufferedRWPair now is closed even when closing
writer failed in BufferedRWPair.close().
parent
1775d230
Changes
4
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
64 additions
and
6 deletions
+64
-6
Lib/_pyio.py
Lib/_pyio.py
+4
-2
Lib/test/test_io.py
Lib/test/test_io.py
+47
-0
Misc/NEWS
Misc/NEWS
+3
-0
Modules/_io/bufferedio.c
Modules/_io/bufferedio.c
+10
-4
No files found.
Lib/_pyio.py
View file @
f85384bc
...
...
@@ -1230,8 +1230,10 @@ class BufferedRWPair(BufferedIOBase):
return
self
.
writer
.
flush
()
def
close
(
self
):
self
.
writer
.
close
()
self
.
reader
.
close
()
try
:
self
.
writer
.
close
()
finally
:
self
.
reader
.
close
()
def
isatty
(
self
):
return
self
.
reader
.
isatty
()
or
self
.
writer
.
isatty
()
...
...
This diff is collapsed.
Click to expand it.
Lib/test/test_io.py
View file @
f85384bc
...
...
@@ -1588,6 +1588,53 @@ class BufferedRWPairTest(unittest.TestCase):
pair
.
close
()
self
.
assertTrue
(
pair
.
closed
)
def
test_reader_close_error_on_close
(
self
):
def
reader_close
():
reader_non_existing
reader
=
self
.
MockRawIO
()
reader
.
close
=
reader_close
writer
=
self
.
MockRawIO
()
pair
=
self
.
tp
(
reader
,
writer
)
with
self
.
assertRaises
(
NameError
)
as
err
:
pair
.
close
()
self
.
assertIn
(
'reader_non_existing'
,
str
(
err
.
exception
))
self
.
assertTrue
(
pair
.
closed
)
self
.
assertFalse
(
reader
.
closed
)
self
.
assertTrue
(
writer
.
closed
)
def
test_writer_close_error_on_close
(
self
):
def
writer_close
():
writer_non_existing
reader
=
self
.
MockRawIO
()
writer
=
self
.
MockRawIO
()
writer
.
close
=
writer_close
pair
=
self
.
tp
(
reader
,
writer
)
with
self
.
assertRaises
(
NameError
)
as
err
:
pair
.
close
()
self
.
assertIn
(
'writer_non_existing'
,
str
(
err
.
exception
))
self
.
assertFalse
(
pair
.
closed
)
self
.
assertTrue
(
reader
.
closed
)
self
.
assertFalse
(
writer
.
closed
)
def
test_reader_writer_close_error_on_close
(
self
):
def
reader_close
():
reader_non_existing
def
writer_close
():
writer_non_existing
reader
=
self
.
MockRawIO
()
reader
.
close
=
reader_close
writer
=
self
.
MockRawIO
()
writer
.
close
=
writer_close
pair
=
self
.
tp
(
reader
,
writer
)
with
self
.
assertRaises
(
NameError
)
as
err
:
pair
.
close
()
self
.
assertIn
(
'reader_non_existing'
,
str
(
err
.
exception
))
self
.
assertIsInstance
(
err
.
exception
.
__context__
,
NameError
)
self
.
assertIn
(
'writer_non_existing'
,
str
(
err
.
exception
.
__context__
))
self
.
assertFalse
(
pair
.
closed
)
self
.
assertFalse
(
reader
.
closed
)
self
.
assertFalse
(
writer
.
closed
)
def
test_isatty
(
self
):
class
SelectableIsAtty
(
MockRawIO
):
def
__init__
(
self
,
isatty
):
...
...
This diff is collapsed.
Click to expand it.
Misc/NEWS
View file @
f85384bc
...
...
@@ -18,6 +18,9 @@ Core and Builtins
Library
-------
- Issue #21802: The reader in BufferedRWPair now is closed even when closing
writer failed in BufferedRWPair.close().
- Issue #23671: string.Template now allows to specify the "self" parameter as
keyword argument. string.Formatter now allows to specify the "self" and
the "format_string" parameters as keyword arguments.
...
...
This diff is collapsed.
Click to expand it.
Modules/_io/bufferedio.c
View file @
f85384bc
...
...
@@ -2365,12 +2365,18 @@ bufferedrwpair_writable(rwpair *self, PyObject *args)
static
PyObject
*
bufferedrwpair_close
(
rwpair
*
self
,
PyObject
*
args
)
{
PyObject
*
exc
=
NULL
,
*
val
,
*
tb
;
PyObject
*
ret
=
_forward_call
(
self
->
writer
,
&
PyId_close
,
args
);
if
(
ret
==
NULL
)
return
NULL
;
Py_DECREF
(
ret
);
return
_forward_call
(
self
->
reader
,
&
PyId_close
,
args
);
PyErr_Fetch
(
&
exc
,
&
val
,
&
tb
);
else
Py_DECREF
(
ret
);
ret
=
_forward_call
(
self
->
reader
,
&
PyId_close
,
args
);
if
(
exc
!=
NULL
)
{
_PyErr_ChainExceptions
(
exc
,
val
,
tb
);
Py_CLEAR
(
ret
);
}
return
ret
;
}
static
PyObject
*
...
...
This diff is collapsed.
Click to expand it.
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment