Você não pode selecionar mais de 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.
 
 
 
 

117 linhas
2.8 KiB

  1. import enum
  2. class FileSystemEvent(enum.IntEnum):
  3. RENAME = uv.UV_RENAME
  4. CHANGE = uv.UV_CHANGE
  5. RENAME_CHANGE = RENAME | CHANGE
  6. @cython.no_gc_clear
  7. cdef class UVFSEvent(UVHandle):
  8. cdef _init(self, Loop loop, object callback, object context):
  9. cdef int err
  10. self._start_init(loop)
  11. self._handle = <uv.uv_handle_t*>PyMem_RawMalloc(
  12. sizeof(uv.uv_fs_event_t)
  13. )
  14. if self._handle is NULL:
  15. self._abort_init()
  16. raise MemoryError()
  17. err = uv.uv_fs_event_init(
  18. self._loop.uvloop, <uv.uv_fs_event_t*>self._handle
  19. )
  20. if err < 0:
  21. self._abort_init()
  22. raise convert_error(err)
  23. self._finish_init()
  24. self.running = 0
  25. self.callback = callback
  26. if context is None:
  27. context = Context_CopyCurrent()
  28. self.context = context
  29. cdef start(self, char* path, int flags):
  30. cdef int err
  31. self._ensure_alive()
  32. if self.running == 0:
  33. err = uv.uv_fs_event_start(
  34. <uv.uv_fs_event_t*>self._handle,
  35. __uvfsevent_callback,
  36. path,
  37. flags,
  38. )
  39. if err < 0:
  40. exc = convert_error(err)
  41. self._fatal_error(exc, True)
  42. return
  43. self.running = 1
  44. cdef stop(self):
  45. cdef int err
  46. if not self._is_alive():
  47. self.running = 0
  48. return
  49. if self.running == 1:
  50. err = uv.uv_fs_event_stop(<uv.uv_fs_event_t*>self._handle)
  51. self.running = 0
  52. if err < 0:
  53. exc = convert_error(err)
  54. self._fatal_error(exc, True)
  55. return
  56. cdef _close(self):
  57. try:
  58. self.stop()
  59. finally:
  60. UVHandle._close(<UVHandle>self)
  61. def cancel(self):
  62. self._close()
  63. def cancelled(self):
  64. return self.running == 0
  65. @staticmethod
  66. cdef UVFSEvent new(Loop loop, object callback, object context):
  67. cdef UVFSEvent handle
  68. handle = UVFSEvent.__new__(UVFSEvent)
  69. handle._init(loop, callback, context)
  70. return handle
  71. cdef void __uvfsevent_callback(
  72. uv.uv_fs_event_t* handle,
  73. const char *filename,
  74. int events,
  75. int status,
  76. ) noexcept with gil:
  77. if __ensure_handle_data(
  78. <uv.uv_handle_t*>handle, "UVFSEvent callback"
  79. ) == 0:
  80. return
  81. cdef:
  82. UVFSEvent fs_event = <UVFSEvent> handle.data
  83. Handle h
  84. try:
  85. h = new_Handle(
  86. fs_event._loop,
  87. fs_event.callback,
  88. (filename, FileSystemEvent(events)),
  89. fs_event.context,
  90. )
  91. h._run()
  92. except BaseException as ex:
  93. fs_event._error(ex, False)