@@ -149,6 +149,8 @@ cdef class Loop:
149149
150150 uv.uv_disable_stdio_inheritance()
151151
152+ self ._coroutine_wrapper_set = False
153+
152154 def __init__ (self ):
153155 self .set_debug((not sys_ignore_environment
154156 and bool (os_environ.get(' PYTHONASYNCIODEBUG' ))))
@@ -684,6 +686,33 @@ cdef class Loop:
684686 else :
685687 fut.set_result(None )
686688
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+
687716 IF DEBUG:
688717 def print_debug_info (self ):
689718 cdef:
@@ -833,7 +862,11 @@ cdef class Loop:
833862 # loop.stop() was called right before loop.run_forever().
834863 # This is how asyncio loop behaves.
835864 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 )
837870
838871 def close (self ):
839872 self ._close()
@@ -850,6 +883,9 @@ cdef class Loop:
850883 else :
851884 self ._debug = 0
852885
886+ if self .is_running():
887+ self ._set_coroutine_wrapper(bool (enabled))
888+
853889 def is_running (self ):
854890 if self ._running == 0 :
855891 return False
0 commit comments