Skip to content

Commit

Permalink
bpo-35930: Raising an exception raised in a "future" instance will cr…
Browse files Browse the repository at this point in the history
  • Loading branch information
jcea authored Mar 29, 2021
1 parent 7bfd65e commit 32430aa
Show file tree
Hide file tree
Showing 2 changed files with 25 additions and 15 deletions.
38 changes: 23 additions & 15 deletions Lib/concurrent/futures/_base.py
Original file line number Diff line number Diff line change
Expand Up @@ -386,7 +386,11 @@ def done(self):

def __get_result(self):
if self._exception:
raise self._exception
try:
raise self._exception
finally:
# Break a reference cycle with the exception in self._exception
self = None
else:
return self._result

Expand Down Expand Up @@ -426,20 +430,24 @@ def result(self, timeout=None):
timeout.
Exception: If the call raised then that exception will be raised.
"""
with self._condition:
if self._state in [CANCELLED, CANCELLED_AND_NOTIFIED]:
raise CancelledError()
elif self._state == FINISHED:
return self.__get_result()

self._condition.wait(timeout)

if self._state in [CANCELLED, CANCELLED_AND_NOTIFIED]:
raise CancelledError()
elif self._state == FINISHED:
return self.__get_result()
else:
raise TimeoutError()
try:
with self._condition:
if self._state in [CANCELLED, CANCELLED_AND_NOTIFIED]:
raise CancelledError()
elif self._state == FINISHED:
return self.__get_result()

self._condition.wait(timeout)

if self._state in [CANCELLED, CANCELLED_AND_NOTIFIED]:
raise CancelledError()
elif self._state == FINISHED:
return self.__get_result()
else:
raise TimeoutError()
finally:
# Break a reference cycle with the exception in self._exception
self = None

def exception(self, timeout=None):
"""Return the exception raised by the call that the future represents.
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
Raising an exception raised in a "future" instance will create reference
cycles.

0 comments on commit 32430aa

Please sign in to comment.