@@ -786,7 +786,7 @@ def cancel(self, msg=None):
786786 return ret
787787
788788
789- def _discard_awaited_by (children , waiter , outer ):
789+ def _discard_awaited_by (children , waiter ):
790790 for fut in children :
791791 futures .future_discard_from_awaited_by (fut , waiter )
792792
@@ -852,11 +852,14 @@ def _done_callback(fut, cur_task=cur_task):
852852 # 'fut.exception()' will *raise* a CancelledError
853853 # instead of returning it.
854854 exc = fut ._make_cancelled_error ()
855+ # gh-157213: children outliving gather() must lose the edge
856+ _discard_awaited_by (children , cur_task )
855857 outer .set_exception (exc )
856858 return
857859 else :
858860 exc = fut .exception ()
859861 if exc is not None :
862+ _discard_awaited_by (children , cur_task )
860863 outer .set_exception (exc )
861864 return
862865
@@ -924,10 +927,6 @@ def _done_callback(fut, cur_task=cur_task):
924927 children .append (fut )
925928
926929 outer = _GatheringFuture (children , loop = loop )
927- if cur_task is not None :
928- # gh-157213: a child outliving gather() must lose the awaited-by edge
929- outer .add_done_callback (
930- functools .partial (_discard_awaited_by , children , cur_task ))
931930 # Run done callbacks after GatheringFuture created so any post-processing
932931 # can be performed at this point
933932 # optimization: in the special case that *all* futures finished eagerly,
0 commit comments