summaryrefslogtreecommitdiff
path: root/venv/lib/python3.11/site-packages/uvloop/handles/fsevent.pyx
diff options
context:
space:
mode:
Diffstat (limited to 'venv/lib/python3.11/site-packages/uvloop/handles/fsevent.pyx')
-rw-r--r--venv/lib/python3.11/site-packages/uvloop/handles/fsevent.pyx116
1 files changed, 116 insertions, 0 deletions
diff --git a/venv/lib/python3.11/site-packages/uvloop/handles/fsevent.pyx b/venv/lib/python3.11/site-packages/uvloop/handles/fsevent.pyx
new file mode 100644
index 0000000..6ed6433
--- /dev/null
+++ b/venv/lib/python3.11/site-packages/uvloop/handles/fsevent.pyx
@@ -0,0 +1,116 @@
+import enum
+
+
+class FileSystemEvent(enum.IntEnum):
+ RENAME = uv.UV_RENAME
+ CHANGE = uv.UV_CHANGE
+ RENAME_CHANGE = RENAME | CHANGE
+
+
+@cython.no_gc_clear
+cdef class UVFSEvent(UVHandle):
+ cdef _init(self, Loop loop, object callback, object context):
+ cdef int err
+
+ self._start_init(loop)
+
+ self._handle = <uv.uv_handle_t*>PyMem_RawMalloc(
+ sizeof(uv.uv_fs_event_t)
+ )
+ if self._handle is NULL:
+ self._abort_init()
+ raise MemoryError()
+
+ err = uv.uv_fs_event_init(
+ self._loop.uvloop, <uv.uv_fs_event_t*>self._handle
+ )
+ if err < 0:
+ self._abort_init()
+ raise convert_error(err)
+
+ self._finish_init()
+
+ self.running = 0
+ self.callback = callback
+ if context is None:
+ context = Context_CopyCurrent()
+ self.context = context
+
+ cdef start(self, char* path, int flags):
+ cdef int err
+
+ self._ensure_alive()
+
+ if self.running == 0:
+ err = uv.uv_fs_event_start(
+ <uv.uv_fs_event_t*>self._handle,
+ __uvfsevent_callback,
+ path,
+ flags,
+ )
+ if err < 0:
+ exc = convert_error(err)
+ self._fatal_error(exc, True)
+ return
+ self.running = 1
+
+ cdef stop(self):
+ cdef int err
+
+ if not self._is_alive():
+ self.running = 0
+ return
+
+ if self.running == 1:
+ err = uv.uv_fs_event_stop(<uv.uv_fs_event_t*>self._handle)
+ self.running = 0
+ if err < 0:
+ exc = convert_error(err)
+ self._fatal_error(exc, True)
+ return
+
+ cdef _close(self):
+ try:
+ self.stop()
+ finally:
+ UVHandle._close(<UVHandle>self)
+
+ def cancel(self):
+ self._close()
+
+ def cancelled(self):
+ return self.running == 0
+
+ @staticmethod
+ cdef UVFSEvent new(Loop loop, object callback, object context):
+ cdef UVFSEvent handle
+ handle = UVFSEvent.__new__(UVFSEvent)
+ handle._init(loop, callback, context)
+ return handle
+
+
+cdef void __uvfsevent_callback(
+ uv.uv_fs_event_t* handle,
+ const char *filename,
+ int events,
+ int status,
+) noexcept with gil:
+ if __ensure_handle_data(
+ <uv.uv_handle_t*>handle, "UVFSEvent callback"
+ ) == 0:
+ return
+
+ cdef:
+ UVFSEvent fs_event = <UVFSEvent> handle.data
+ Handle h
+
+ try:
+ h = new_Handle(
+ fs_event._loop,
+ fs_event.callback,
+ (filename, FileSystemEvent(events)),
+ fs_event.context,
+ )
+ h._run()
+ except BaseException as ex:
+ fs_event._error(ex, False)