@@ -149,6 +149,8 @@ cdef class Loop:
149
149
150
150
uv.uv_disable_stdio_inheritance()
151
151
152
+ self ._coroutine_wrapper_set = False
153
+
152
154
def __init__ (self ):
153
155
self .set_debug((not sys_ignore_environment
154
156
and bool (os_environ.get(' PYTHONASYNCIODEBUG' ))))
@@ -684,6 +686,33 @@ cdef class Loop:
684
686
else :
685
687
fut.set_result(None )
686
688
689
+ cdef _set_coroutine_wrapper(self , bint enabled):
690
+ enabled = bool (enabled)
691
+ if self ._coroutine_wrapper_set == enabled:
692
+ return
693
+
694
+ wrapper = aio_debug_wrapper
695
+ current_wrapper = sys_get_coroutine_wrapper()
696
+
697
+ if enabled:
698
+ if current_wrapper not in (None , wrapper):
699
+ warnings.warn(
700
+ " loop.set_debug(True): cannot set debug coroutine "
701
+ " wrapper; another wrapper is already set %r " %
702
+ current_wrapper, RuntimeWarning )
703
+ else :
704
+ sys_set_coroutine_wrapper(wrapper)
705
+ self ._coroutine_wrapper_set = True
706
+ else :
707
+ if current_wrapper not in (None , wrapper):
708
+ warnings.warn(
709
+ " loop.set_debug(False): cannot unset debug coroutine "
710
+ " wrapper; another wrapper was set %r " %
711
+ current_wrapper, RuntimeWarning )
712
+ else :
713
+ sys_set_coroutine_wrapper(None )
714
+ self ._coroutine_wrapper_set = False
715
+
687
716
IF DEBUG:
688
717
def print_debug_info (self ):
689
718
cdef:
@@ -833,7 +862,11 @@ cdef class Loop:
833
862
# loop.stop() was called right before loop.run_forever().
834
863
# This is how asyncio loop behaves.
835
864
mode = uv.UV_RUN_NOWAIT
836
- self ._run(mode)
865
+ self ._set_coroutine_wrapper(self ._debug)
866
+ try :
867
+ self ._run(mode)
868
+ finally :
869
+ self ._set_coroutine_wrapper(0 )
837
870
838
871
def close (self ):
839
872
self ._close()
@@ -850,6 +883,9 @@ cdef class Loop:
850
883
else :
851
884
self ._debug = 0
852
885
886
+ if self .is_running():
887
+ self ._set_coroutine_wrapper(bool (enabled))
888
+
853
889
def is_running (self ):
854
890
if self ._running == 0 :
855
891
return False
0 commit comments