@cython.no_gc_clear cdef class UVIdle(UVHandle): cdef _init(self, Loop loop, Handle h): cdef int err self._start_init(loop) self._handle = PyMem_RawMalloc(sizeof(uv.uv_idle_t)) if self._handle is NULL: self._abort_init() raise MemoryError() err = uv.uv_idle_init(self._loop.uvloop, self._handle) if err < 0: self._abort_init() raise convert_error(err) self._finish_init() self.h = h self.running = 0 cdef inline stop(self): cdef int err if not self._is_alive(): self.running = 0 return if self.running == 1: err = uv.uv_idle_stop(self._handle) self.running = 0 if err < 0: exc = convert_error(err) self._fatal_error(exc, True) return cdef inline start(self): cdef int err self._ensure_alive() if self.running == 0: err = uv.uv_idle_start(self._handle, cb_idle_callback) if err < 0: exc = convert_error(err) self._fatal_error(exc, True) return self.running = 1 @staticmethod cdef UVIdle new(Loop loop, Handle h): cdef UVIdle handle handle = UVIdle.__new__(UVIdle) handle._init(loop, h) return handle cdef void cb_idle_callback( uv.uv_idle_t* handle, ) noexcept with gil: if __ensure_handle_data(handle, "UVIdle callback") == 0: return cdef: UVIdle idle = handle.data Handle h = idle.h try: h._run() except BaseException as ex: idle._error(ex, False)