zuvloop 0.0.2__tar.gz → 0.0.4__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (504) hide show
  1. {zuvloop-0.0.2 → zuvloop-0.0.4}/PKG-INFO +12 -8
  2. {zuvloop-0.0.2 → zuvloop-0.0.4}/README.md +11 -7
  3. {zuvloop-0.0.2 → zuvloop-0.0.4}/pyproject.toml +17 -2
  4. zuvloop-0.0.4/vendor/README.md +17 -0
  5. zuvloop-0.0.4/vendor/libuv-maintainer-keys.txt +12 -0
  6. zuvloop-0.0.4/vendor/update-libuv.sh +38 -0
  7. {zuvloop-0.0.2 → zuvloop-0.0.4}/zig/addr.zig +4 -3
  8. {zuvloop-0.0.2 → zuvloop-0.0.4}/zig/datagram.zig +8 -6
  9. {zuvloop-0.0.2 → zuvloop-0.0.4}/zig/dns.zig +5 -0
  10. {zuvloop-0.0.2 → zuvloop-0.0.4}/zig/handle.zig +15 -4
  11. {zuvloop-0.0.2 → zuvloop-0.0.4}/zig/loop.zig +7 -3
  12. {zuvloop-0.0.2 → zuvloop-0.0.4}/zig/process.zig +4 -4
  13. {zuvloop-0.0.2 → zuvloop-0.0.4}/zig/transport.zig +45 -12
  14. {zuvloop-0.0.2 → zuvloop-0.0.4}/zuvloop/_base.py +115 -16
  15. {zuvloop-0.0.2 → zuvloop-0.0.4}/zuvloop/_connect.py +3 -3
  16. {zuvloop-0.0.2 → zuvloop-0.0.4}/zuvloop/_instrumentation.py +2 -2
  17. zuvloop-0.0.4/zuvloop/_loop.py +105 -0
  18. {zuvloop-0.0.2 → zuvloop-0.0.4}/zuvloop/_process.py +117 -49
  19. zuvloop-0.0.4/zuvloop/_sendfile.py +268 -0
  20. {zuvloop-0.0.2 → zuvloop-0.0.4}/zuvloop/_sockets.py +9 -25
  21. {zuvloop-0.0.2 → zuvloop-0.0.4}/zuvloop/_zuvloop.pyi +2 -0
  22. zuvloop-0.0.2/vendor/README.md +0 -13
  23. zuvloop-0.0.2/vendor/update-libuv.sh +0 -21
  24. zuvloop-0.0.2/zuvloop/_loop.py +0 -64
  25. {zuvloop-0.0.2 → zuvloop-0.0.4}/.gitignore +0 -0
  26. {zuvloop-0.0.2 → zuvloop-0.0.4}/LICENSE +0 -0
  27. {zuvloop-0.0.2 → zuvloop-0.0.4}/build.zig +0 -0
  28. {zuvloop-0.0.2 → zuvloop-0.0.4}/build.zig.zon +0 -0
  29. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/.gitattributes +0 -0
  30. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/.github/ISSUE_TEMPLATE.md +0 -0
  31. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/.github/dependabot.yml +0 -0
  32. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/.github/workflows/CI-docs.yml +0 -0
  33. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/.github/workflows/CI-sample.yml +0 -0
  34. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/.github/workflows/CI-unix.yml +0 -0
  35. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/.github/workflows/CI-win.yml +0 -0
  36. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/.github/workflows/sanitizer.yml +0 -0
  37. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/.gitignore +0 -0
  38. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/.mailmap +0 -0
  39. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/.readthedocs.yaml +0 -0
  40. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/AUTHORS +0 -0
  41. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/CMakeLists.txt +0 -0
  42. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/CONTRIBUTING.md +0 -0
  43. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/ChangeLog +0 -0
  44. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/LICENSE +0 -0
  45. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/LICENSE-docs +0 -0
  46. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/LICENSE-extra +0 -0
  47. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/LINKS.md +0 -0
  48. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/MAINTAINERS.md +0 -0
  49. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/Makefile.am +0 -0
  50. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/README.md +0 -0
  51. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/SECURITY.md +0 -0
  52. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/SUPPORTED_PLATFORMS.md +0 -0
  53. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/autogen.sh +0 -0
  54. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/cmake-toolchains/cross-mingw32.cmake +0 -0
  55. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/configure.ac +0 -0
  56. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/docs/code/.gitignore +0 -0
  57. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/docs/code/CMakeLists.txt +0 -0
  58. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/docs/code/cgi/main.c +0 -0
  59. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/docs/code/cgi/tick.c +0 -0
  60. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/docs/code/default-loop/main.c +0 -0
  61. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/docs/code/detach/main.c +0 -0
  62. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/docs/code/dns/main.c +0 -0
  63. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/docs/code/helloworld/main.c +0 -0
  64. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/docs/code/idle-basic/main.c +0 -0
  65. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/docs/code/idle-compute/main.c +0 -0
  66. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/docs/code/interfaces/main.c +0 -0
  67. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/docs/code/locks/main.c +0 -0
  68. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/docs/code/multi-echo-server/main.c +0 -0
  69. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/docs/code/multi-echo-server/worker.c +0 -0
  70. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/docs/code/onchange/main.c +0 -0
  71. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/docs/code/pipe-echo-server/main.c +0 -0
  72. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/docs/code/plugin/hello.c +0 -0
  73. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/docs/code/plugin/main.c +0 -0
  74. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/docs/code/plugin/plugin.h +0 -0
  75. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/docs/code/proc-streams/main.c +0 -0
  76. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/docs/code/proc-streams/test.c +0 -0
  77. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/docs/code/progress/main.c +0 -0
  78. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/docs/code/queue-cancel/main.c +0 -0
  79. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/docs/code/queue-work/main.c +0 -0
  80. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/docs/code/ref-timer/main.c +0 -0
  81. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/docs/code/signal/main.c +0 -0
  82. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/docs/code/spawn/main.c +0 -0
  83. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/docs/code/tcp-echo-server/main.c +0 -0
  84. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/docs/code/thread-create/main.c +0 -0
  85. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/docs/code/tty/main.c +0 -0
  86. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/docs/code/tty-gravity/main.c +0 -0
  87. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/docs/code/udp-dhcp/main.c +0 -0
  88. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/docs/code/uvcat/main.c +0 -0
  89. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/docs/code/uvstop/main.c +0 -0
  90. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/docs/code/uvtee/main.c +0 -0
  91. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/docs/code/uvwget/main.c +0 -0
  92. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/docs/make.bat +0 -0
  93. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/docs/requirements.txt +0 -0
  94. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/docs/src/api.rst +0 -0
  95. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/docs/src/async.rst +0 -0
  96. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/docs/src/check.rst +0 -0
  97. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/docs/src/conf.py +0 -0
  98. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/docs/src/design.rst +0 -0
  99. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/docs/src/dll.rst +0 -0
  100. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/docs/src/dns.rst +0 -0
  101. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/docs/src/errors.rst +0 -0
  102. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/docs/src/fs.rst +0 -0
  103. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/docs/src/fs_event.rst +0 -0
  104. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/docs/src/fs_poll.rst +0 -0
  105. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/docs/src/guide/about.rst +0 -0
  106. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/docs/src/guide/basics.rst +0 -0
  107. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/docs/src/guide/eventloops.rst +0 -0
  108. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/docs/src/guide/filesystem.rst +0 -0
  109. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/docs/src/guide/introduction.rst +0 -0
  110. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/docs/src/guide/networking.rst +0 -0
  111. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/docs/src/guide/processes.rst +0 -0
  112. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/docs/src/guide/threads.rst +0 -0
  113. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/docs/src/guide/utilities.rst +0 -0
  114. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/docs/src/guide.rst +0 -0
  115. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/docs/src/handle.rst +0 -0
  116. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/docs/src/idle.rst +0 -0
  117. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/docs/src/index.rst +0 -0
  118. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/docs/src/loop.rst +0 -0
  119. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/docs/src/metrics.rst +0 -0
  120. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/docs/src/migration_010_100.rst +0 -0
  121. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/docs/src/misc.rst +0 -0
  122. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/docs/src/pipe.rst +0 -0
  123. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/docs/src/poll.rst +0 -0
  124. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/docs/src/prepare.rst +0 -0
  125. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/docs/src/process.rst +0 -0
  126. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/docs/src/request.rst +0 -0
  127. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/docs/src/signal.rst +0 -0
  128. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/docs/src/sphinx-plugins/manpage.py +0 -0
  129. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/docs/src/static/architecture.png +0 -0
  130. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/docs/src/static/diagrams.key/Data/st0-311.jpg +0 -0
  131. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/docs/src/static/diagrams.key/Data/st1-475.jpg +0 -0
  132. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/docs/src/static/diagrams.key/Index.zip +0 -0
  133. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/docs/src/static/diagrams.key/Metadata/BuildVersionHistory.plist +0 -0
  134. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/docs/src/static/diagrams.key/Metadata/DocumentIdentifier +0 -0
  135. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/docs/src/static/diagrams.key/Metadata/Properties.plist +0 -0
  136. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/docs/src/static/diagrams.key/preview-micro.jpg +0 -0
  137. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/docs/src/static/diagrams.key/preview-web.jpg +0 -0
  138. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/docs/src/static/diagrams.key/preview.jpg +0 -0
  139. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/docs/src/static/favicon.ico +0 -0
  140. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/docs/src/static/logo.png +0 -0
  141. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/docs/src/static/loop_iteration.png +0 -0
  142. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/docs/src/stream.rst +0 -0
  143. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/docs/src/tcp.rst +0 -0
  144. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/docs/src/threading.rst +0 -0
  145. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/docs/src/threadpool.rst +0 -0
  146. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/docs/src/timer.rst +0 -0
  147. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/docs/src/tty.rst +0 -0
  148. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/docs/src/udp.rst +0 -0
  149. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/docs/src/upgrading.rst +0 -0
  150. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/docs/src/version.rst +0 -0
  151. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/img/banner.png +0 -0
  152. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/img/logos.svg +0 -0
  153. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/include/uv/aix.h +0 -0
  154. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/include/uv/bsd.h +0 -0
  155. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/include/uv/darwin.h +0 -0
  156. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/include/uv/errno.h +0 -0
  157. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/include/uv/linux.h +0 -0
  158. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/include/uv/os390.h +0 -0
  159. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/include/uv/posix.h +0 -0
  160. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/include/uv/sunos.h +0 -0
  161. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/include/uv/threadpool.h +0 -0
  162. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/include/uv/tree.h +0 -0
  163. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/include/uv/unix.h +0 -0
  164. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/include/uv/version.h +0 -0
  165. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/include/uv/win.h +0 -0
  166. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/include/uv.h +0 -0
  167. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/libuv-static.pc.in +0 -0
  168. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/libuv.pc.in +0 -0
  169. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/m4/.gitignore +0 -0
  170. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/m4/as_case.m4 +0 -0
  171. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/m4/ax_pthread.m4 +0 -0
  172. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/m4/libuv-check-flags.m4 +0 -0
  173. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/src/fs-poll.c +0 -0
  174. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/src/heap-inl.h +0 -0
  175. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/src/idna.c +0 -0
  176. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/src/idna.h +0 -0
  177. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/src/inet.c +0 -0
  178. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/src/queue.h +0 -0
  179. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/src/random.c +0 -0
  180. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/src/strscpy.c +0 -0
  181. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/src/strscpy.h +0 -0
  182. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/src/strtok.c +0 -0
  183. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/src/strtok.h +0 -0
  184. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/src/thread-common.c +0 -0
  185. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/src/threadpool.c +0 -0
  186. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/src/timer.c +0 -0
  187. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/src/unix/aix-common.c +0 -0
  188. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/src/unix/aix.c +0 -0
  189. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/src/unix/async.c +0 -0
  190. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/src/unix/bsd-ifaddrs.c +0 -0
  191. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/src/unix/bsd-proctitle.c +0 -0
  192. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/src/unix/core.c +0 -0
  193. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/src/unix/cygwin.c +0 -0
  194. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/src/unix/darwin-proctitle.c +0 -0
  195. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/src/unix/darwin-stub.h +0 -0
  196. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/src/unix/darwin-syscalls.h +0 -0
  197. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/src/unix/darwin.c +0 -0
  198. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/src/unix/dl.c +0 -0
  199. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/src/unix/freebsd.c +0 -0
  200. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/src/unix/fs.c +0 -0
  201. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/src/unix/fsevents.c +0 -0
  202. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/src/unix/getaddrinfo.c +0 -0
  203. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/src/unix/getnameinfo.c +0 -0
  204. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/src/unix/haiku.c +0 -0
  205. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/src/unix/hurd.c +0 -0
  206. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/src/unix/ibmi.c +0 -0
  207. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/src/unix/internal.h +0 -0
  208. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/src/unix/kqueue.c +0 -0
  209. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/src/unix/linux.c +0 -0
  210. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/src/unix/loop-watcher.c +0 -0
  211. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/src/unix/loop.c +0 -0
  212. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/src/unix/netbsd.c +0 -0
  213. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/src/unix/no-fsevents.c +0 -0
  214. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/src/unix/no-proctitle.c +0 -0
  215. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/src/unix/openbsd.c +0 -0
  216. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/src/unix/os390-proctitle.c +0 -0
  217. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/src/unix/os390-syscalls.c +0 -0
  218. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/src/unix/os390-syscalls.h +0 -0
  219. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/src/unix/os390.c +0 -0
  220. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/src/unix/pipe.c +0 -0
  221. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/src/unix/poll.c +0 -0
  222. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/src/unix/posix-hrtime.c +0 -0
  223. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/src/unix/posix-poll.c +0 -0
  224. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/src/unix/process.c +0 -0
  225. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/src/unix/procfs-exepath.c +0 -0
  226. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/src/unix/proctitle.c +0 -0
  227. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/src/unix/qnx.c +0 -0
  228. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/src/unix/random-devurandom.c +0 -0
  229. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/src/unix/random-getentropy.c +0 -0
  230. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/src/unix/random-getrandom.c +0 -0
  231. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/src/unix/random-sysctl-linux.c +0 -0
  232. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/src/unix/signal.c +0 -0
  233. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/src/unix/stream.c +0 -0
  234. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/src/unix/sunos.c +0 -0
  235. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/src/unix/sysinfo-loadavg.c +0 -0
  236. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/src/unix/sysinfo-memory.c +0 -0
  237. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/src/unix/tcp.c +0 -0
  238. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/src/unix/thread.c +0 -0
  239. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/src/unix/tty.c +0 -0
  240. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/src/unix/udp.c +0 -0
  241. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/src/uv-common.c +0 -0
  242. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/src/uv-common.h +0 -0
  243. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/src/uv-data-getter-setters.c +0 -0
  244. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/src/version.c +0 -0
  245. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/src/win/async.c +0 -0
  246. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/src/win/atomicops-inl.h +0 -0
  247. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/src/win/core.c +0 -0
  248. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/src/win/detect-wakeup.c +0 -0
  249. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/src/win/dl.c +0 -0
  250. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/src/win/error.c +0 -0
  251. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/src/win/fs-event.c +0 -0
  252. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/src/win/fs-fd-hash-inl.h +0 -0
  253. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/src/win/fs.c +0 -0
  254. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/src/win/getaddrinfo.c +0 -0
  255. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/src/win/getnameinfo.c +0 -0
  256. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/src/win/handle-inl.h +0 -0
  257. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/src/win/handle.c +0 -0
  258. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/src/win/internal.h +0 -0
  259. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/src/win/loop-watcher.c +0 -0
  260. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/src/win/pipe.c +0 -0
  261. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/src/win/poll.c +0 -0
  262. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/src/win/process-stdio.c +0 -0
  263. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/src/win/process.c +0 -0
  264. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/src/win/req-inl.h +0 -0
  265. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/src/win/signal.c +0 -0
  266. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/src/win/snprintf.c +0 -0
  267. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/src/win/stream-inl.h +0 -0
  268. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/src/win/stream.c +0 -0
  269. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/src/win/tcp.c +0 -0
  270. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/src/win/thread.c +0 -0
  271. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/src/win/tty.c +0 -0
  272. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/src/win/udp.c +0 -0
  273. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/src/win/util.c +0 -0
  274. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/src/win/winapi.c +0 -0
  275. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/src/win/winapi.h +0 -0
  276. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/src/win/winsock.c +0 -0
  277. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/src/win/winsock.h +0 -0
  278. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/test/benchmark-async-pummel.c +0 -0
  279. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/test/benchmark-async.c +0 -0
  280. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/test/benchmark-fs-stat.c +0 -0
  281. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/test/benchmark-getaddrinfo.c +0 -0
  282. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/test/benchmark-list.h +0 -0
  283. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/test/benchmark-loop-count.c +0 -0
  284. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/test/benchmark-million-async.c +0 -0
  285. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/test/benchmark-million-timers.c +0 -0
  286. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/test/benchmark-multi-accept.c +0 -0
  287. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/test/benchmark-ping-pongs.c +0 -0
  288. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/test/benchmark-ping-udp.c +0 -0
  289. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/test/benchmark-pound.c +0 -0
  290. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/test/benchmark-pump.c +0 -0
  291. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/test/benchmark-queue-work.c +0 -0
  292. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/test/benchmark-sizes.c +0 -0
  293. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/test/benchmark-spawn.c +0 -0
  294. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/test/benchmark-tcp-write-batch.c +0 -0
  295. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/test/benchmark-thread.c +0 -0
  296. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/test/benchmark-udp-pummel.c +0 -0
  297. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/test/blackhole-server.c +0 -0
  298. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/test/echo-server.c +0 -0
  299. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/test/fixtures/empty_file +0 -0
  300. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/test/fixtures/load_error.node +0 -0
  301. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/test/fixtures/lorem_ipsum.txt +0 -0
  302. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/test/fixtures/one_file/one_file +0 -0
  303. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/test/run-benchmarks.c +0 -0
  304. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/test/run-tests.c +0 -0
  305. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/test/runner-unix.c +0 -0
  306. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/test/runner-unix.h +0 -0
  307. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/test/runner-win.c +0 -0
  308. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/test/runner-win.h +0 -0
  309. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/test/runner.c +0 -0
  310. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/test/runner.h +0 -0
  311. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/test/task.h +0 -0
  312. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/test/test-active.c +0 -0
  313. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/test/test-async-null-cb.c +0 -0
  314. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/test/test-async.c +0 -0
  315. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/test/test-barrier.c +0 -0
  316. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/test/test-callback-stack.c +0 -0
  317. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/test/test-close-fd.c +0 -0
  318. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/test/test-close-order.c +0 -0
  319. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/test/test-condvar.c +0 -0
  320. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/test/test-connect-unspecified.c +0 -0
  321. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/test/test-connection-fail.c +0 -0
  322. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/test/test-cwd-and-chdir.c +0 -0
  323. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/test/test-default-loop-close.c +0 -0
  324. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/test/test-delayed-accept.c +0 -0
  325. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/test/test-dlerror.c +0 -0
  326. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/test/test-eintr-handling.c +0 -0
  327. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/test/test-embed.c +0 -0
  328. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/test/test-emfile.c +0 -0
  329. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/test/test-env-vars.c +0 -0
  330. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/test/test-error.c +0 -0
  331. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/test/test-fail-always.c +0 -0
  332. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/test/test-fork.c +0 -0
  333. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/test/test-fs-copyfile.c +0 -0
  334. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/test/test-fs-event.c +0 -0
  335. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/test/test-fs-fd-hash.c +0 -0
  336. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/test/test-fs-open-flags.c +0 -0
  337. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/test/test-fs-poll.c +0 -0
  338. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/test/test-fs-readdir.c +0 -0
  339. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/test/test-fs.c +0 -0
  340. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/test/test-get-currentexe.c +0 -0
  341. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/test/test-get-loadavg.c +0 -0
  342. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/test/test-get-memory.c +0 -0
  343. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/test/test-get-passwd.c +0 -0
  344. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/test/test-getaddrinfo.c +0 -0
  345. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/test/test-gethostname.c +0 -0
  346. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/test/test-getnameinfo.c +0 -0
  347. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/test/test-getsockname.c +0 -0
  348. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/test/test-getters-setters.c +0 -0
  349. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/test/test-gettimeofday.c +0 -0
  350. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/test/test-handle-fileno.c +0 -0
  351. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/test/test-homedir.c +0 -0
  352. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/test/test-hrtime.c +0 -0
  353. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/test/test-idle.c +0 -0
  354. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/test/test-idna.c +0 -0
  355. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/test/test-iouring-pollhup.c +0 -0
  356. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/test/test-ip-name.c +0 -0
  357. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/test/test-ip4-addr.c +0 -0
  358. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/test/test-ip6-addr.c +0 -0
  359. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/test/test-ipc-heavy-traffic-deadlock-bug.c +0 -0
  360. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/test/test-ipc-send-recv.c +0 -0
  361. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/test/test-ipc.c +0 -0
  362. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/test/test-list.h +0 -0
  363. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/test/test-loop-alive.c +0 -0
  364. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/test/test-loop-close.c +0 -0
  365. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/test/test-loop-configure.c +0 -0
  366. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/test/test-loop-handles.c +0 -0
  367. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/test/test-loop-oom.c +0 -0
  368. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/test/test-loop-stop.c +0 -0
  369. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/test/test-loop-time.c +0 -0
  370. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/test/test-metrics.c +0 -0
  371. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/test/test-multiple-listen.c +0 -0
  372. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/test/test-mutexes.c +0 -0
  373. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/test/test-not-readable-nor-writable-on-read-error.c +0 -0
  374. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/test/test-not-writable-after-shutdown.c +0 -0
  375. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/test/test-osx-select.c +0 -0
  376. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/test/test-pass-always.c +0 -0
  377. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/test/test-ping-pong.c +0 -0
  378. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/test/test-pipe-bind-error.c +0 -0
  379. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/test/test-pipe-close-stdout-read-stdin.c +0 -0
  380. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/test/test-pipe-connect-error.c +0 -0
  381. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/test/test-pipe-connect-multiple.c +0 -0
  382. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/test/test-pipe-connect-prepare.c +0 -0
  383. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/test/test-pipe-getsockname.c +0 -0
  384. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/test/test-pipe-pending-instances.c +0 -0
  385. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/test/test-pipe-sendmsg.c +0 -0
  386. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/test/test-pipe-server-close.c +0 -0
  387. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/test/test-pipe-set-fchmod.c +0 -0
  388. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/test/test-pipe-set-non-blocking.c +0 -0
  389. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/test/test-platform-output.c +0 -0
  390. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/test/test-poll-close-doesnt-corrupt-stack.c +0 -0
  391. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/test/test-poll-close.c +0 -0
  392. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/test/test-poll-closesocket.c +0 -0
  393. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/test/test-poll-multiple-handles.c +0 -0
  394. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/test/test-poll-oob.c +0 -0
  395. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/test/test-poll.c +0 -0
  396. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/test/test-process-priority.c +0 -0
  397. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/test/test-process-title-threadsafe.c +0 -0
  398. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/test/test-process-title.c +0 -0
  399. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/test/test-queue-foreach-delete.c +0 -0
  400. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/test/test-random.c +0 -0
  401. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/test/test-readable-on-eof.c +0 -0
  402. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/test/test-ref.c +0 -0
  403. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/test/test-run-nowait.c +0 -0
  404. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/test/test-run-once.c +0 -0
  405. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/test/test-semaphore.c +0 -0
  406. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/test/test-shutdown-close.c +0 -0
  407. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/test/test-shutdown-eof.c +0 -0
  408. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/test/test-shutdown-simultaneous.c +0 -0
  409. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/test/test-shutdown-twice.c +0 -0
  410. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/test/test-signal-multiple-loops.c +0 -0
  411. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/test/test-signal-pending-on-close.c +0 -0
  412. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/test/test-signal.c +0 -0
  413. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/test/test-socket-buffer-size.c +0 -0
  414. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/test/test-spawn.c +0 -0
  415. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/test/test-stdio-over-pipes.c +0 -0
  416. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/test/test-strscpy.c +0 -0
  417. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/test/test-strtok.c +0 -0
  418. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/test/test-tcp-alloc-cb-fail.c +0 -0
  419. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/test/test-tcp-bind-error.c +0 -0
  420. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/test/test-tcp-bind6-error.c +0 -0
  421. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/test/test-tcp-close-accept.c +0 -0
  422. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/test/test-tcp-close-after-read-timeout.c +0 -0
  423. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/test/test-tcp-close-reset.c +0 -0
  424. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/test/test-tcp-close-while-connecting.c +0 -0
  425. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/test/test-tcp-close.c +0 -0
  426. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/test/test-tcp-connect-error-after-write.c +0 -0
  427. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/test/test-tcp-connect-error.c +0 -0
  428. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/test/test-tcp-connect-timeout.c +0 -0
  429. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/test/test-tcp-connect6-error.c +0 -0
  430. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/test/test-tcp-create-socket-early.c +0 -0
  431. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/test/test-tcp-flags.c +0 -0
  432. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/test/test-tcp-oob.c +0 -0
  433. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/test/test-tcp-open.c +0 -0
  434. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/test/test-tcp-read-stop-start.c +0 -0
  435. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/test/test-tcp-read-stop.c +0 -0
  436. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/test/test-tcp-reuseport.c +0 -0
  437. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/test/test-tcp-rst.c +0 -0
  438. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/test/test-tcp-shutdown-after-write.c +0 -0
  439. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/test/test-tcp-try-write-error.c +0 -0
  440. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/test/test-tcp-try-write.c +0 -0
  441. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/test/test-tcp-unexpected-read.c +0 -0
  442. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/test/test-tcp-write-after-connect.c +0 -0
  443. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/test/test-tcp-write-fail.c +0 -0
  444. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/test/test-tcp-write-in-a-row.c +0 -0
  445. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/test/test-tcp-write-queue-order.c +0 -0
  446. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/test/test-tcp-write-to-half-open-connection.c +0 -0
  447. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/test/test-tcp-writealot.c +0 -0
  448. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/test/test-test-macros.c +0 -0
  449. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/test/test-thread-affinity.c +0 -0
  450. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/test/test-thread-equal.c +0 -0
  451. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/test/test-thread-name.c +0 -0
  452. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/test/test-thread-priority.c +0 -0
  453. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/test/test-thread.c +0 -0
  454. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/test/test-threadpool-cancel.c +0 -0
  455. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/test/test-threadpool.c +0 -0
  456. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/test/test-timer-again.c +0 -0
  457. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/test/test-timer-from-check.c +0 -0
  458. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/test/test-timer.c +0 -0
  459. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/test/test-tmpdir.c +0 -0
  460. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/test/test-tty-duplicate-key.c +0 -0
  461. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/test/test-tty-escape-sequence-processing.c +0 -0
  462. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/test/test-tty.c +0 -0
  463. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/test/test-udp-alloc-cb-fail.c +0 -0
  464. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/test/test-udp-bind.c +0 -0
  465. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/test/test-udp-connect.c +0 -0
  466. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/test/test-udp-connect6.c +0 -0
  467. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/test/test-udp-create-socket-early.c +0 -0
  468. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/test/test-udp-dgram-too-big.c +0 -0
  469. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/test/test-udp-ipv6.c +0 -0
  470. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/test/test-udp-mmsg.c +0 -0
  471. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/test/test-udp-multicast-interface.c +0 -0
  472. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/test/test-udp-multicast-interface6.c +0 -0
  473. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/test/test-udp-multicast-join.c +0 -0
  474. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/test/test-udp-multicast-join6.c +0 -0
  475. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/test/test-udp-multicast-ttl.c +0 -0
  476. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/test/test-udp-open.c +0 -0
  477. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/test/test-udp-options.c +0 -0
  478. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/test/test-udp-recv-in-a-row.c +0 -0
  479. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/test/test-udp-reuseport.c +0 -0
  480. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/test/test-udp-send-and-recv.c +0 -0
  481. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/test/test-udp-send-hang-loop.c +0 -0
  482. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/test/test-udp-send-immediate.c +0 -0
  483. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/test/test-udp-send-unreachable.c +0 -0
  484. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/test/test-udp-sendmmsg-error.c +0 -0
  485. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/test/test-udp-try-send.c +0 -0
  486. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/test/test-uname.c +0 -0
  487. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/test/test-walk-handles.c +0 -0
  488. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/test/test-watcher-cross-stop.c +0 -0
  489. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/tools/make_dist_html.py +0 -0
  490. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/tools/vswhere_usability_wrapper.cmd +0 -0
  491. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/tsansupp.txt +0 -0
  492. {zuvloop-0.0.2 → zuvloop-0.0.4}/vendor/libuv/uv_win_longpath.manifest +0 -0
  493. {zuvloop-0.0.2 → zuvloop-0.0.4}/zig/c.zig +0 -0
  494. {zuvloop-0.0.2 → zuvloop-0.0.4}/zig/collections.zig +0 -0
  495. {zuvloop-0.0.2 → zuvloop-0.0.4}/zig/module.zig +0 -0
  496. {zuvloop-0.0.2 → zuvloop-0.0.4}/zig/poller.zig +0 -0
  497. {zuvloop-0.0.2 → zuvloop-0.0.4}/zig/py.zig +0 -0
  498. {zuvloop-0.0.2 → zuvloop-0.0.4}/zig/timer.zig +0 -0
  499. {zuvloop-0.0.2 → zuvloop-0.0.4}/zig/tshandle.zig +0 -0
  500. {zuvloop-0.0.2 → zuvloop-0.0.4}/zig/uv.zig +0 -0
  501. {zuvloop-0.0.2 → zuvloop-0.0.4}/zuvloop/__init__.py +0 -0
  502. {zuvloop-0.0.2 → zuvloop-0.0.4}/zuvloop/_runner.py +0 -0
  503. {zuvloop-0.0.2 → zuvloop-0.0.4}/zuvloop/_server.py +0 -0
  504. {zuvloop-0.0.2 → zuvloop-0.0.4}/zuvloop/py.typed +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: zuvloop
3
- Version: 0.0.2
3
+ Version: 0.0.4
4
4
  Summary: A libuv event loop for asyncio, written in Zig.
5
5
  Project-URL: Source, https://github.com/Kludex/zuvloop
6
6
  Author-email: Marcelo Trylesinski <marcelotryle@gmail.com>
@@ -122,9 +122,11 @@ That's it. That's the migration. 🎉
122
122
  ## Observability
123
123
 
124
124
  zuvloop emits plain OpenTelemetry. The only runtime dependency is `opentelemetry-api` — not the
125
- SDK, nothing vendor-specific. Configure providers before starting the loop; zuvloop checks for them
126
- at each `run_forever()` entry. Until then the instruments are no-ops and slow-callback timing stays
127
- off.
125
+ SDK, nothing vendor-specific. Providers can be configured before the loop starts or from inside
126
+ it — `logfire.configure()` in `main()` works: zuvloop checks at each `run_forever()` entry and
127
+ re-checks on its sampling interval (`loop.metrics_interval`, 10 seconds by default) while the
128
+ loop runs. Until a provider is installed the instruments are no-ops and slow-callback timing
129
+ stays off.
128
130
 
129
131
  Anything that speaks OpenTelemetry can collect it. For example, with
130
132
  <a href="https://logfire.pydantic.dev" target="_blank">Logfire</a>:
@@ -144,8 +146,8 @@ zuvloop.run(main())
144
146
 
145
147
  That's all — there is no zuvloop-specific setup. Spans and counters are emitted
146
148
  as events happen, and the loop gauges are sampled automatically while the loop
147
- runs (only when a real provider is installed, so an uninstrumented program never
148
- pays for sampling).
149
+ runs (published only once a real provider is installed; without one the
150
+ snapshot is dropped).
149
151
 
150
152
  You get:
151
153
 
@@ -193,7 +195,7 @@ zuvloop keeps its timer heap in native code and reads the clock directly, so mon
193
195
  returns and nothing else. A loop that needs a controllable clock should schedule against one
194
196
  explicitly.
195
197
 
196
- Also not implemented: `sendfile()` and `sock_sendfile()` raise `NotImplementedError`. Handles
198
+ One more deliberate divergence: handles
197
199
  returned by `call_soon` implement the `asyncio.Handle` interface but are not instances of it:
198
200
  the base class is 56 bytes of storage such a handle never writes, measured at 2% of `call_soon`,
199
201
  which is the object the loop allocates more often than any other. `call_later` and `call_at`
@@ -209,6 +211,8 @@ $ uv pip install -e . --group dev
209
211
  $ uv run pytest
210
212
  $ uv run mypy
211
213
  $ uv run ruff check
214
+ $ uv run ruff format --check
215
+ $ ./scripts/check-zig # requires ZLint 0.9.1 on PATH
212
216
  $ uv run --group bench python benchmarks/run.py
213
217
  ```
214
218
 
@@ -219,7 +223,7 @@ $ python scripts/build.py
219
223
  ```
220
224
 
221
225
  `vendor/libuv` is an unmodified upstream release tarball; see `vendor/README.md`. Update it with
222
- `./vendor/update-libuv.sh <version>`.
226
+ `./vendor/update-libuv.sh <version> <sha256>`.
223
227
 
224
228
  ## License
225
229
 
@@ -98,9 +98,11 @@ That's it. That's the migration. 🎉
98
98
  ## Observability
99
99
 
100
100
  zuvloop emits plain OpenTelemetry. The only runtime dependency is `opentelemetry-api` — not the
101
- SDK, nothing vendor-specific. Configure providers before starting the loop; zuvloop checks for them
102
- at each `run_forever()` entry. Until then the instruments are no-ops and slow-callback timing stays
103
- off.
101
+ SDK, nothing vendor-specific. Providers can be configured before the loop starts or from inside
102
+ it — `logfire.configure()` in `main()` works: zuvloop checks at each `run_forever()` entry and
103
+ re-checks on its sampling interval (`loop.metrics_interval`, 10 seconds by default) while the
104
+ loop runs. Until a provider is installed the instruments are no-ops and slow-callback timing
105
+ stays off.
104
106
 
105
107
  Anything that speaks OpenTelemetry can collect it. For example, with
106
108
  <a href="https://logfire.pydantic.dev" target="_blank">Logfire</a>:
@@ -120,8 +122,8 @@ zuvloop.run(main())
120
122
 
121
123
  That's all — there is no zuvloop-specific setup. Spans and counters are emitted
122
124
  as events happen, and the loop gauges are sampled automatically while the loop
123
- runs (only when a real provider is installed, so an uninstrumented program never
124
- pays for sampling).
125
+ runs (published only once a real provider is installed; without one the
126
+ snapshot is dropped).
125
127
 
126
128
  You get:
127
129
 
@@ -169,7 +171,7 @@ zuvloop keeps its timer heap in native code and reads the clock directly, so mon
169
171
  returns and nothing else. A loop that needs a controllable clock should schedule against one
170
172
  explicitly.
171
173
 
172
- Also not implemented: `sendfile()` and `sock_sendfile()` raise `NotImplementedError`. Handles
174
+ One more deliberate divergence: handles
173
175
  returned by `call_soon` implement the `asyncio.Handle` interface but are not instances of it:
174
176
  the base class is 56 bytes of storage such a handle never writes, measured at 2% of `call_soon`,
175
177
  which is the object the loop allocates more often than any other. `call_later` and `call_at`
@@ -185,6 +187,8 @@ $ uv pip install -e . --group dev
185
187
  $ uv run pytest
186
188
  $ uv run mypy
187
189
  $ uv run ruff check
190
+ $ uv run ruff format --check
191
+ $ ./scripts/check-zig # requires ZLint 0.9.1 on PATH
188
192
  $ uv run --group bench python benchmarks/run.py
189
193
  ```
190
194
 
@@ -195,7 +199,7 @@ $ python scripts/build.py
195
199
  ```
196
200
 
197
201
  `vendor/libuv` is an unmodified upstream release tarball; see `vendor/README.md`. Update it with
198
- `./vendor/update-libuv.sh <version>`.
202
+ `./vendor/update-libuv.sh <version> <sha256>`.
199
203
 
200
204
  ## License
201
205
 
@@ -1,14 +1,18 @@
1
1
  [build-system]
2
- requires = ["hatchling", "hatch-ziglang", "ziglang==0.16.0"]
2
+ # hatch-ziglang is pinned exactly: it runs during the isolated wheel build and
3
+ # invokes the native compiler, so a future version resolved from a lower bound
4
+ # could execute unreviewed code into the wheels the publish job trusts. The
5
+ # compiler is pinned for the same reason. Bump both deliberately.
6
+ requires = ["hatchling", "hatch-vcs==0.5.0", "hatch-ziglang==0.2.1", "ziglang==0.16.0"]
3
7
  build-backend = "hatchling.build"
4
8
 
5
9
  [project]
6
10
  name = "zuvloop"
7
- version = "0.0.2"
8
11
  description = "A libuv event loop for asyncio, written in Zig."
9
12
  readme = "README.md"
10
13
  requires-python = ">=3.14"
11
14
  license = "MIT"
15
+ dynamic = ["version"]
12
16
  # libuv is compiled into the extension, so its licence ships with the wheel.
13
17
  license-files = ["LICENSE", "vendor/libuv/LICENSE*"]
14
18
  authors = [{ name = "Marcelo Trylesinski", email = "marcelotryle@gmail.com" }]
@@ -40,6 +44,17 @@ dev = [
40
44
  bench = ["aiohttp", "httptools", "pytest-codspeed>=5", "uvicorn", "uvloop>=0.21"]
41
45
  docs = ["zensical"]
42
46
 
47
+ [tool.hatch.version]
48
+ source = "vcs"
49
+
50
+ [tool.hatch.version.raw-options]
51
+ # A tag is the version; commits after it are the next patch's dev builds, so an
52
+ # untagged build can never claim to be the release. `no-local-version` drops the
53
+ # `+<hash>` segment, which PyPI refuses on upload.
54
+ version_scheme = "guess-next-dev"
55
+ local_scheme = "no-local-version"
56
+ fallback_version = "0.0.0"
57
+
43
58
  [tool.hatch.build.targets.wheel]
44
59
  packages = ["zuvloop"]
45
60
 
@@ -0,0 +1,17 @@
1
+ # Vendored dependencies
2
+
3
+ ## libuv
4
+
5
+ - Version: **1.51.0**
6
+ - Source: <https://dist.libuv.org/dist/v1.51.0/libuv-v1.51.0.tar.gz>
7
+ - SHA-256: `5f0557b90b1106de71951a3c3931de5e0430d78da1d9a10287ebc7a3f78ef8eb`
8
+
9
+ The tree under `libuv/` is the upstream release tarball, extracted verbatim. **Never edit it.**
10
+ Everything zuvloop adds lives in `zig/`, and `build.zig` compiles the vendored sources with the same
11
+ defines and file lists as upstream's `CMakeLists.txt`.
12
+
13
+ A weekly workflow checks for a new signed release, verifies its signer against
14
+ `libuv-maintainer-keys.txt`, tests every supported target, and opens an update pull request. For a
15
+ manual update, verify the checksum through an independent channel, then run
16
+ `./vendor/update-libuv.sh <version> <sha256>` and re-check the file lists at the top of `build.zig`
17
+ against the new `CMakeLists.txt`.
@@ -0,0 +1,12 @@
1
+ # Full fingerprint and libuv git tag containing the public key.
2
+ # Keep this trust root in sync with https://github.com/libuv/libuv/blob/v1.x/MAINTAINERS.md.
3
+ D77B1E34243FBAF05F8E9CC34F55C8C846AB89B9 pubkey-bnoordhuis
4
+ 94AE36675C464D64BAFA68DD7434390BDBE9B9C5 pubkey-cjihrig
5
+ 57353E0DBDAAA7E839B66A1AFF47D5E4AD8B4FDC pubkey-cjihrig-kb
6
+ AEAD0A4B686767751A0E4AEF34A25FB128246514 pubkey-vtjnash
7
+ CFBB9CA9A5BEAFD70E2B3C5A79A67C55A3679C8B pubkey2022-vtjnash
8
+ 5804F9998A922AFBA39847A0718350906134887F github:erw7
9
+ C82FA3AE1CBEDC6BE46B9360C43CEC45C17AB93C pubkey-richardlau
10
+ 612F0EAD9401622379DF4402F28C3C8DA33C03BE pubkey-santigimeno
11
+ FDF519364458319FA8233DC9410E5553AE9BC059 pubkey-saghul
12
+ AEFC279A0C9306767E5829A1251CA676820DC7F3 pubkey-trevnorris
@@ -0,0 +1,38 @@
1
+ #!/usr/bin/env bash
2
+ # Replace vendor/libuv with a pristine upstream release tarball.
3
+ set -euo pipefail
4
+
5
+ version="${1:?usage: update-libuv.sh <version> <sha256>, e.g. 1.51.0 5f0557...}"
6
+ checksum="${2:?supply the SHA-256 published for libuv ${version}}"
7
+ if [[ ! "$version" =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
8
+ echo "invalid libuv version: $version" >&2
9
+ exit 2
10
+ fi
11
+ if [[ ! "$checksum" =~ ^[[:xdigit:]]{64}$ ]]; then
12
+ echo "invalid SHA-256: $checksum" >&2
13
+ exit 2
14
+ fi
15
+ here="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
16
+ url="https://dist.libuv.org/dist/v${version}/libuv-v${version}.tar.gz"
17
+
18
+ tmp="$(mktemp -d)"
19
+ trap 'rm -rf "$tmp"' EXIT
20
+
21
+ curl -fsSL "$url" -o "$tmp/libuv.tar.gz"
22
+ printf '%s %s\n' "$checksum" "$tmp/libuv.tar.gz" | shasum -a 256 -c -
23
+ tar xzf "$tmp/libuv.tar.gz" -C "$tmp"
24
+ rm -rf "$here/libuv"
25
+ mv "$tmp/libuv-v${version}" "$here/libuv"
26
+
27
+ sed -i.bak -E "s/\*\*[0-9]+\.[0-9]+\.[0-9]+\*\*/**${version}**/; s|dist/v[0-9]+\.[0-9]+\.[0-9]+/libuv-v[0-9]+\.[0-9]+\.[0-9]+|dist/v${version}/libuv-v${version}|g; s|SHA-256: \`[[:xdigit:]]{64}\`|SHA-256: \`${checksum}\`|" "$here/README.md"
28
+ if ! grep -Fq -- "- Version: **${version}**" "$here/README.md" ||
29
+ ! grep -Fq -- "dist/v${version}/libuv-v${version}.tar.gz" "$here/README.md" ||
30
+ ! grep -Fq -- "SHA-256: \`${checksum}\`" "$here/README.md"; then
31
+ mv "$here/README.md.bak" "$here/README.md"
32
+ echo "failed to update vendor/README.md; check its format" >&2
33
+ exit 1
34
+ fi
35
+ rm -f "$here/README.md.bak"
36
+
37
+ echo "vendored libuv ${version} from ${url}"
38
+ echo "now diff vendor/libuv/CMakeLists.txt against the source lists in build.zig"
@@ -35,6 +35,7 @@ fn tupleItem(t: *py.Object, i: c.Py_ssize_t) py.Error!*py.Object {
35
35
  pub fn fromPython(family: c_int, address: *py.Object, out: *Storage) py.Error!c_int {
36
36
  out.* = .{};
37
37
  if (family == AF_UNIX) {
38
+ // SAFETY: each accepted address type assigns path, and every other type returns.
38
39
  var path: [*c]const u8 = undefined;
39
40
  var len: c.Py_ssize_t = 0;
40
41
  if (c.PyUnicode_Check(address) != 0) {
@@ -146,9 +147,9 @@ pub fn same(a: *const posix.sockaddr, a_len: c_int, b: *const posix.sockaddr, b_
146
147
  const x: *const posix.sockaddr.in6 = @ptrCast(@alignCast(a));
147
148
  const y: *const posix.sockaddr.in6 = @ptrCast(@alignCast(b));
148
149
  if (x.port != y.port or !std.mem.eql(u8, &x.addr, &y.addr)) return false;
149
- // asyncio compares tuples, so it wants the scope stated rather than
150
- // treating a zero as a wildcard.
151
- return x.scope_id == y.scope_id;
150
+ // asyncio compares the complete tuples, so both ancillary fields must
151
+ // be stated exactly rather than treating zero as a wildcard.
152
+ return x.flowinfo == y.flowinfo and x.scope_id == y.scope_id;
152
153
  }
153
154
  return false;
154
155
  }
@@ -392,6 +392,7 @@ fn sendto(self_obj: *py.Object, args: []const ?*py.Object, nargs: usize, kwnames
392
392
  return py.errValue("sendto() requires an address on an unconnected transport");
393
393
  }
394
394
 
395
+ // SAFETY: PyObject_GetBuffer initializes view or returns an error.
395
396
  var view: c.Py_buffer = undefined;
396
397
  if (c.PyObject_GetBuffer(args[0].?, &view, c.PyBUF_SIMPLE) < 0) return py.Error.Python;
397
398
  defer c.PyBuffer_Release(&view);
@@ -596,12 +597,13 @@ pub fn makeDatagram(self_obj: *py.Object, args: []const ?*py.Object) py.Error!*p
596
597
  self.flags |= OPEN;
597
598
  uv.setData(self.udp(), self);
598
599
 
599
- if (uv.uv_udp_open(self.udp(), fd) < 0) {
600
+ const status = uv.uv_udp_open(self.udp(), fd);
601
+ if (status < 0) {
600
602
  // libuv never took the descriptor, so the caller still owns it.
601
603
  self.flags &= ~OPEN;
602
604
  py.incref(obj);
603
605
  uv.uv_close(uv.asHandle(self.udp()), onOpenFailed);
604
- return py.errUv(uv.uv_udp_open(self.udp(), fd));
606
+ return py.errUv(status);
605
607
  }
606
608
 
607
609
  py.incref(obj);
@@ -704,11 +706,11 @@ var methods = [_]c.PyMethodDef{
704
706
  };
705
707
 
706
708
  var slots = [_]c.PyType_Slot{
707
- .{ .slot = c.Py_tp_dealloc, .pfunc = @constCast(@ptrCast(&dealloc)) },
708
- .{ .slot = c.Py_tp_traverse, .pfunc = @constCast(@ptrCast(&traverse)) },
709
- .{ .slot = c.Py_tp_clear, .pfunc = @constCast(@ptrCast(&clear_)) },
709
+ .{ .slot = c.Py_tp_dealloc, .pfunc = @ptrCast(@constCast(&dealloc)) },
710
+ .{ .slot = c.Py_tp_traverse, .pfunc = @ptrCast(@constCast(&traverse)) },
711
+ .{ .slot = c.Py_tp_clear, .pfunc = @ptrCast(@constCast(&clear_)) },
710
712
  .{ .slot = c.Py_tp_methods, .pfunc = @ptrCast(&methods) },
711
- .{ .slot = c.Py_tp_doc, .pfunc = @constCast(@ptrCast("A libuv-backed datagram transport.")) },
713
+ .{ .slot = c.Py_tp_doc, .pfunc = @ptrCast(@constCast("A libuv-backed datagram transport.")) },
712
714
  .{ .slot = 0, .pfunc = null },
713
715
  };
714
716
 
@@ -36,7 +36,9 @@ const Request = struct {
36
36
  prev: ?*Request = null,
37
37
  next: ?*Request = null,
38
38
  hints: std.c.addrinfo = std.mem.zeroes(std.c.addrinfo),
39
+ // SAFETY: request construction fills this array before libuv receives it.
39
40
  host: [max_host]u8 = undefined,
41
+ // SAFETY: request construction fills this array before libuv receives it.
40
42
  service: [32]u8 = undefined,
41
43
 
42
44
  inline fn addrReq(self: *Request) *uv.GetAddrInfo {
@@ -117,6 +119,7 @@ pub fn traverse(st: *loopmod.State, visitproc: c.visitproc, arg: ?*anyopaque) c_
117
119
  fn copyZ(dst: []u8, value: *py.Object, what: [:0]const u8) py.Error!?[*:0]const u8 {
118
120
  if (py.isNone(value)) return null;
119
121
  var len: c.Py_ssize_t = 0;
122
+ // SAFETY: each accepted Python type assigns src, and every other type returns.
120
123
  var src: [*c]const u8 = undefined;
121
124
  if (c.PyUnicode_Check(value) != 0) {
122
125
  src = c.PyUnicode_AsUTF8AndSize(value, &len) orelse return py.Error.Python;
@@ -368,6 +371,8 @@ fn resolveLiteral(hints: *const std.c.addrinfo, host: ?[*:0]const u8, service: ?
368
371
  port = std.fmt.parseInt(u16, text, 10) catch return null;
369
372
  }
370
373
 
374
+ // SAFETY: inet_pton initializes the address and the successful branch fills
375
+ // the remaining sockaddr fields before storage is read.
371
376
  var storage: addr.Storage = undefined;
372
377
  const family = hints.family;
373
378
  if (family == std.c.AF.INET or family == std.c.AF.UNSPEC) {
@@ -17,6 +17,7 @@ const inline_args = 3;
17
17
  const arg_alloc = std.heap.c_allocator;
18
18
 
19
19
  pub const CANCELLED: u32 = 1 << 0;
20
+ const RUNNING: u32 = 1 << 1;
20
21
 
21
22
  pub const Handle = extern struct {
22
23
  ob_base: c.PyObject,
@@ -86,6 +87,14 @@ pub fn create(
86
87
  pub fn run(self: *Handle) void {
87
88
  if (self.isCancelled()) return;
88
89
  const callback = self.callback orelse return;
90
+ self.flags |= RUNNING;
91
+ defer {
92
+ self.flags &= ~RUNNING;
93
+ if (self.isCancelled()) {
94
+ clearArgs(self);
95
+ py.clear(&self.callback);
96
+ }
97
+ }
89
98
  invoke(@ptrCast(self), self.loop, callback, self.argv(), self.nargs, self.context.?);
90
99
  }
91
100
 
@@ -168,8 +177,12 @@ fn cancel(self_obj: *py.Object) py.Error!*py.Object {
168
177
  const self: *Handle = @ptrCast(@alignCast(self_obj));
169
178
  if (!self.isCancelled()) {
170
179
  self.flags |= CANCELLED;
171
- clearArgs(self);
172
- py.clear(&self.callback);
180
+ // Vectorcall borrows these references. A callback may cancel its own
181
+ // handle, so release them when run() regains control instead.
182
+ if (self.flags & RUNNING == 0) {
183
+ clearArgs(self);
184
+ py.clear(&self.callback);
185
+ }
173
186
  }
174
187
  return py.noneRef();
175
188
  }
@@ -179,7 +192,6 @@ fn cancelled(self_obj: *py.Object) py.Error!*py.Object {
179
192
  return py.boolRef(self.isCancelled());
180
193
  }
181
194
 
182
-
183
195
  fn getCallback(self_obj: ?*py.Object, _: ?*anyopaque) callconv(.c) ?*py.Object {
184
196
  const self: *Handle = @ptrCast(@alignCast(self_obj.?));
185
197
  return py.newref(self.callback orelse py.none());
@@ -243,7 +255,6 @@ var handle_spec = c.PyType_Spec{
243
255
  .slots = &handle_slots,
244
256
  };
245
257
 
246
-
247
258
  pub fn register(module: *py.Object) py.Error!void {
248
259
  handle_type = @ptrCast(c.PyType_FromModuleAndSpec(module, &handle_spec, null) orelse return py.Error.Python);
249
260
  if (c.PyModule_AddObjectRef(module, "Handle", @ptrCast(handle_type)) < 0) return py.Error.Python;
@@ -904,7 +904,7 @@ fn dealloc(obj: ?*py.Object) callconv(.c) void {
904
904
  if (needs_close) {
905
905
  st.ready.deinit();
906
906
  st.timers.deinit();
907
- }
907
+ }
908
908
  // The flush list owns one Python reference per transport regardless of
909
909
  // how the loop reached deallocation, including partially completed
910
910
  // explicit close paths.
@@ -951,8 +951,12 @@ fn traverse(obj: ?*py.Object, visitproc: c.visitproc, arg: ?*anyopaque) callconv
951
951
  if (r != 0) return r;
952
952
  transport = owned.owner_next;
953
953
  }
954
- r = dns.traverse(st, visitproc, arg);
955
- if (r != 0) return r;
954
+ // Once close hands resolver requests to the native reaper, their
955
+ // futures are gone and the request list mutates without the GIL.
956
+ if (!isReaping(st)) {
957
+ r = dns.traverse(st, visitproc, arg);
958
+ if (r != 0) return r;
959
+ }
956
960
  r = pollermod.traverse(st, visitproc, arg);
957
961
  if (r != 0) return r;
958
962
  }
@@ -347,11 +347,11 @@ var methods = [_]c.PyMethodDef{
347
347
  };
348
348
 
349
349
  var slots = [_]c.PyType_Slot{
350
- .{ .slot = c.Py_tp_dealloc, .pfunc = @constCast(@ptrCast(&dealloc)) },
351
- .{ .slot = c.Py_tp_traverse, .pfunc = @constCast(@ptrCast(&traverse)) },
352
- .{ .slot = c.Py_tp_clear, .pfunc = @constCast(@ptrCast(&clear_)) },
350
+ .{ .slot = c.Py_tp_dealloc, .pfunc = @ptrCast(@constCast(&dealloc)) },
351
+ .{ .slot = c.Py_tp_traverse, .pfunc = @ptrCast(@constCast(&traverse)) },
352
+ .{ .slot = c.Py_tp_clear, .pfunc = @ptrCast(@constCast(&clear_)) },
353
353
  .{ .slot = c.Py_tp_methods, .pfunc = @ptrCast(&methods) },
354
- .{ .slot = c.Py_tp_doc, .pfunc = @constCast(@ptrCast("A libuv-backed child process.")) },
354
+ .{ .slot = c.Py_tp_doc, .pfunc = @ptrCast(@constCast("A libuv-backed child process.")) },
355
355
  .{ .slot = 0, .pfunc = null },
356
356
  };
357
357
 
@@ -136,12 +136,12 @@ pub const Transport = extern struct {
136
136
 
137
137
  var handle_offset: usize = 0;
138
138
 
139
- /// A queued write: the libuv request, the buffer views keeping the caller's
140
- /// memory alive, and the vector libuv reads from - all in one allocation.
139
+ /// A queued write: the libuv request, immutable buffer views, and the vector
140
+ /// libuv reads from - all in one allocation.
141
141
  ///
142
- /// Retaining views rather than copying is what makes a large `write()` free:
143
- /// the exporter stays alive (and, for a bytearray, locked against resizing)
144
- /// until libuv reports the write complete.
142
+ /// An exact `bytes` object is retained without copying. Every other exporter is
143
+ /// snapshotted first, so its view owns immutable bytes rather than caller memory;
144
+ /// either way the backing object stays alive until libuv reports completion.
145
145
  ///
146
146
  /// The request does not take another Python reference to `transport`. The
147
147
  /// loop-owned handle reference remains alive until `onClosed`, and libuv runs
@@ -178,6 +178,23 @@ fn releaseViews(views: []c.Py_buffer) void {
178
178
  for (views) |*view| c.PyBuffer_Release(view);
179
179
  }
180
180
 
181
+ /// Hold immutable bytes directly; snapshot every other exporter before write()
182
+ /// returns so queued I/O cannot observe later mutations by the caller.
183
+ fn acquireWriteView(data: *py.Object, view: *c.Py_buffer) py.Error!void {
184
+ if (c.PyBytes_CheckExact(data) != 0) {
185
+ if (c.PyObject_GetBuffer(data, view, c.PyBUF_SIMPLE) < 0) return py.Error.Python;
186
+ return;
187
+ }
188
+
189
+ // SAFETY: PyObject_GetBuffer initializes source or returns an error.
190
+ var source: c.Py_buffer = undefined;
191
+ if (c.PyObject_GetBuffer(data, &source, c.PyBUF_SIMPLE) < 0) return py.Error.Python;
192
+ defer c.PyBuffer_Release(&source);
193
+ const snapshot = c.PyBytes_FromStringAndSize(@ptrCast(source.buf), source.len) orelse return py.Error.Python;
194
+ defer py.decref(snapshot);
195
+ if (c.PyObject_GetBuffer(snapshot, view, c.PyBUF_SIMPLE) < 0) return py.Error.Python;
196
+ }
197
+
181
198
  // ---------------------------------------------------------------------------
182
199
  // protocol dispatch
183
200
 
@@ -550,9 +567,13 @@ fn queueWrite(self: *Transport, bufs: []const uv.Buf, views: []c.Py_buffer) py.E
550
567
  /// Whether a write may proceed, releasing `views` if it may not.
551
568
  ///
552
569
  /// A close only drops the data; raising would turn an ordinary shutdown race
553
- /// into an exception. `write_eof()` is the caller's mistake and each entry point
554
- /// rejects it earlier, so an empty write is an error too.
570
+ /// into an exception. `write_eof()` is the caller's mistake, and must be checked
571
+ /// here too because acquiring an iterable or buffer can reenter the transport.
555
572
  fn acceptsWrite(self: *Transport, views: []c.Py_buffer) py.Error!bool {
573
+ if (self.flags & EOF_WRITTEN != 0) {
574
+ releaseViews(views);
575
+ return py.errRuntime("Cannot write after write_eof()");
576
+ }
556
577
  if (self.flags & (CONN_LOST | CLOSING) != 0) {
557
578
  releaseViews(views);
558
579
  return false;
@@ -875,8 +896,9 @@ pub fn startReadingMethod(self_obj: *py.Object) py.Error!*py.Object {
875
896
 
876
897
  fn write(self_obj: *py.Object, data: *py.Object) py.Error!*py.Object {
877
898
  const self = asTransport(self_obj);
899
+ // SAFETY: acquireWriteView initializes the only element or returns an error.
878
900
  var views = [_]c.Py_buffer{undefined};
879
- if (c.PyObject_GetBuffer(data, &views[0], c.PyBUF_SIMPLE) < 0) return py.Error.Python;
901
+ try acquireWriteView(data, &views[0]);
880
902
  if (self.flags & EOF_WRITTEN != 0) {
881
903
  c.PyBuffer_Release(&views[0]);
882
904
  return py.errRuntime("Cannot call write() after write_eof()");
@@ -912,12 +934,12 @@ fn writelines(self_obj: *py.Object, data: *py.Object) py.Error!*py.Object {
912
934
  return py.Error.Python;
913
935
  };
914
936
  // The buffer view keeps the exporter alive, so the item reference can go.
915
- const acquired = c.PyObject_GetBuffer(item, &views[filled], c.PyBUF_SIMPLE);
916
- py.decref(item);
917
- if (acquired < 0) {
937
+ acquireWriteView(item, &views[filled]) catch {
938
+ py.decref(item);
918
939
  releaseViews(views[0..filled]);
919
940
  return py.Error.Python;
920
- }
941
+ };
942
+ py.decref(item);
921
943
  bufs[filled] = .{ .base = @ptrCast(views[filled].buf), .len = @intCast(views[filled].len) };
922
944
  }
923
945
  try submitWrite(self, bufs, views);
@@ -1005,6 +1027,10 @@ fn forceCloseMethod(self_obj: *py.Object, exc: *py.Object) py.Error!*py.Object {
1005
1027
  return py.noneRef();
1006
1028
  }
1007
1029
 
1030
+ fn getProtocolPaused(self_obj: ?*py.Object, _: ?*anyopaque) callconv(.c) ?*py.Object {
1031
+ return py.boolRef(asTransport(self_obj.?).flags & PROTOCOL_PAUSED != 0);
1032
+ }
1033
+
1008
1034
  // ---------------------------------------------------------------------------
1009
1035
  // construction
1010
1036
 
@@ -1225,12 +1251,19 @@ var methods = [_]c.PyMethodDef{
1225
1251
  py.sentinel,
1226
1252
  };
1227
1253
 
1254
+ // asyncio's name for this state; its sendfile machinery reads it off transports.
1255
+ var getsets = [_]c.PyGetSetDef{
1256
+ .{ .name = "_protocol_paused", .get = getProtocolPaused, .set = null, .doc = "Whether flow control has paused the protocol.", .closure = null },
1257
+ .{ .name = null, .get = null, .set = null, .doc = null, .closure = null },
1258
+ };
1259
+
1228
1260
  var slots = [_]c.PyType_Slot{
1229
1261
  .{ .slot = c.Py_tp_dealloc, .pfunc = @ptrCast(@constCast(&dealloc)) },
1230
1262
  .{ .slot = c.Py_tp_traverse, .pfunc = @ptrCast(@constCast(&traverse)) },
1231
1263
  .{ .slot = c.Py_tp_clear, .pfunc = @ptrCast(@constCast(&clear_)) },
1232
1264
  .{ .slot = c.Py_tp_repr, .pfunc = @ptrCast(@constCast(&repr)) },
1233
1265
  .{ .slot = c.Py_tp_methods, .pfunc = @ptrCast(&methods) },
1266
+ .{ .slot = c.Py_tp_getset, .pfunc = @ptrCast(&getsets) },
1234
1267
  .{ .slot = c.Py_tp_doc, .pfunc = @ptrCast(@constCast("A libuv-backed stream transport.")) },
1235
1268
  .{ .slot = 0, .pfunc = null },
1236
1269
  };