mirror of
https://github.com/python/cpython.git
synced 2025-08-24 18:55:00 +00:00
bpo-35930: Raising an exception raised in a "future" instance will create reference cycles (#24995)
Before:0c14bc58/attachment-0002.png
After:0c14bc58/attachment-0003.png
This commit is contained in:
parent
7bfd65eba7
commit
32430aadad
2 changed files with 23 additions and 13 deletions
|
@ -386,7 +386,11 @@ class Future(object):
|
||||||
|
|
||||||
def __get_result(self):
|
def __get_result(self):
|
||||||
if self._exception:
|
if self._exception:
|
||||||
raise self._exception
|
try:
|
||||||
|
raise self._exception
|
||||||
|
finally:
|
||||||
|
# Break a reference cycle with the exception in self._exception
|
||||||
|
self = None
|
||||||
else:
|
else:
|
||||||
return self._result
|
return self._result
|
||||||
|
|
||||||
|
@ -426,20 +430,24 @@ class Future(object):
|
||||||
timeout.
|
timeout.
|
||||||
Exception: If the call raised then that exception will be raised.
|
Exception: If the call raised then that exception will be raised.
|
||||||
"""
|
"""
|
||||||
with self._condition:
|
try:
|
||||||
if self._state in [CANCELLED, CANCELLED_AND_NOTIFIED]:
|
with self._condition:
|
||||||
raise CancelledError()
|
if self._state in [CANCELLED, CANCELLED_AND_NOTIFIED]:
|
||||||
elif self._state == FINISHED:
|
raise CancelledError()
|
||||||
return self.__get_result()
|
elif self._state == FINISHED:
|
||||||
|
return self.__get_result()
|
||||||
|
|
||||||
self._condition.wait(timeout)
|
self._condition.wait(timeout)
|
||||||
|
|
||||||
if self._state in [CANCELLED, CANCELLED_AND_NOTIFIED]:
|
if self._state in [CANCELLED, CANCELLED_AND_NOTIFIED]:
|
||||||
raise CancelledError()
|
raise CancelledError()
|
||||||
elif self._state == FINISHED:
|
elif self._state == FINISHED:
|
||||||
return self.__get_result()
|
return self.__get_result()
|
||||||
else:
|
else:
|
||||||
raise TimeoutError()
|
raise TimeoutError()
|
||||||
|
finally:
|
||||||
|
# Break a reference cycle with the exception in self._exception
|
||||||
|
self = None
|
||||||
|
|
||||||
def exception(self, timeout=None):
|
def exception(self, timeout=None):
|
||||||
"""Return the exception raised by the call that the future represents.
|
"""Return the exception raised by the call that the future represents.
|
||||||
|
|
|
@ -0,0 +1,2 @@
|
||||||
|
Raising an exception raised in a "future" instance will create reference
|
||||||
|
cycles.
|
Loading…
Add table
Add a link
Reference in a new issue