def METHOD_NAME(self):
    # SlowCoroWatchingThread.run() checks periodically that we are not currently in the coroutine step that already
    # took too much time but is not finished yet. This way, we can detect a freezer coroutine that never finished
    # or a coroutine that freezes the loop until the GUI process decides to kill the Core process. In contrast to
    # patched_handle_run(), it is not guaranteed that SlowCoroWatchingThread.run() is triggered for each coroutine,
    # a coroutine that was just slightly longer than the limit may be missed by SlowCoroWatchingThread.run().
    #
    # Also, SlowCoroWatchingThread.run() displays the current main stack (as we are inside a running coroutine)
    # while patched_handle_run() does not display the stack (as the coroutine step is already finished).
    prev_reported_handle = None  # to detect in the loop when we have the second report of the same slow coroutine
    while not self.stop_event.is_set():
        time.sleep(WATCHING_THREAD_INTERVAL)
        with lock:
            handle, start_time = current.handle, current.start_time
        new_reported_handle = None
        if handle is not None:
            duration = time.time() - start_time
            if duration > SLOW_CORO_DURATION_THRESHOLD:
                _report_freeze(current.handle, duration, first_report=prev_reported_handle is not handle)
                new_reported_handle = handle
        prev_reported_handle = new_reported_handle