zuvloop 0.0.2__tar.gz → 0.0.3__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 (500) hide show
  1. {zuvloop-0.0.2 → zuvloop-0.0.3}/PKG-INFO +9 -7
  2. {zuvloop-0.0.2 → zuvloop-0.0.3}/README.md +8 -6
  3. {zuvloop-0.0.2 → zuvloop-0.0.3}/pyproject.toml +17 -2
  4. {zuvloop-0.0.2 → zuvloop-0.0.3}/zig/transport.zig +11 -0
  5. {zuvloop-0.0.2 → zuvloop-0.0.3}/zuvloop/_base.py +19 -7
  6. {zuvloop-0.0.2 → zuvloop-0.0.3}/zuvloop/_connect.py +2 -2
  7. {zuvloop-0.0.2 → zuvloop-0.0.3}/zuvloop/_instrumentation.py +1 -1
  8. zuvloop-0.0.3/zuvloop/_sendfile.py +268 -0
  9. {zuvloop-0.0.2 → zuvloop-0.0.3}/zuvloop/_sockets.py +9 -25
  10. {zuvloop-0.0.2 → zuvloop-0.0.3}/zuvloop/_zuvloop.pyi +2 -0
  11. {zuvloop-0.0.2 → zuvloop-0.0.3}/.gitignore +0 -0
  12. {zuvloop-0.0.2 → zuvloop-0.0.3}/LICENSE +0 -0
  13. {zuvloop-0.0.2 → zuvloop-0.0.3}/build.zig +0 -0
  14. {zuvloop-0.0.2 → zuvloop-0.0.3}/build.zig.zon +0 -0
  15. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/README.md +0 -0
  16. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/.gitattributes +0 -0
  17. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/.github/ISSUE_TEMPLATE.md +0 -0
  18. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/.github/dependabot.yml +0 -0
  19. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/.github/workflows/CI-docs.yml +0 -0
  20. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/.github/workflows/CI-sample.yml +0 -0
  21. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/.github/workflows/CI-unix.yml +0 -0
  22. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/.github/workflows/CI-win.yml +0 -0
  23. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/.github/workflows/sanitizer.yml +0 -0
  24. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/.gitignore +0 -0
  25. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/.mailmap +0 -0
  26. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/.readthedocs.yaml +0 -0
  27. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/AUTHORS +0 -0
  28. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/CMakeLists.txt +0 -0
  29. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/CONTRIBUTING.md +0 -0
  30. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/ChangeLog +0 -0
  31. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/LICENSE +0 -0
  32. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/LICENSE-docs +0 -0
  33. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/LICENSE-extra +0 -0
  34. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/LINKS.md +0 -0
  35. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/MAINTAINERS.md +0 -0
  36. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/Makefile.am +0 -0
  37. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/README.md +0 -0
  38. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/SECURITY.md +0 -0
  39. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/SUPPORTED_PLATFORMS.md +0 -0
  40. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/autogen.sh +0 -0
  41. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/cmake-toolchains/cross-mingw32.cmake +0 -0
  42. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/configure.ac +0 -0
  43. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/docs/code/.gitignore +0 -0
  44. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/docs/code/CMakeLists.txt +0 -0
  45. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/docs/code/cgi/main.c +0 -0
  46. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/docs/code/cgi/tick.c +0 -0
  47. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/docs/code/default-loop/main.c +0 -0
  48. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/docs/code/detach/main.c +0 -0
  49. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/docs/code/dns/main.c +0 -0
  50. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/docs/code/helloworld/main.c +0 -0
  51. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/docs/code/idle-basic/main.c +0 -0
  52. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/docs/code/idle-compute/main.c +0 -0
  53. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/docs/code/interfaces/main.c +0 -0
  54. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/docs/code/locks/main.c +0 -0
  55. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/docs/code/multi-echo-server/main.c +0 -0
  56. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/docs/code/multi-echo-server/worker.c +0 -0
  57. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/docs/code/onchange/main.c +0 -0
  58. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/docs/code/pipe-echo-server/main.c +0 -0
  59. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/docs/code/plugin/hello.c +0 -0
  60. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/docs/code/plugin/main.c +0 -0
  61. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/docs/code/plugin/plugin.h +0 -0
  62. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/docs/code/proc-streams/main.c +0 -0
  63. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/docs/code/proc-streams/test.c +0 -0
  64. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/docs/code/progress/main.c +0 -0
  65. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/docs/code/queue-cancel/main.c +0 -0
  66. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/docs/code/queue-work/main.c +0 -0
  67. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/docs/code/ref-timer/main.c +0 -0
  68. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/docs/code/signal/main.c +0 -0
  69. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/docs/code/spawn/main.c +0 -0
  70. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/docs/code/tcp-echo-server/main.c +0 -0
  71. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/docs/code/thread-create/main.c +0 -0
  72. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/docs/code/tty/main.c +0 -0
  73. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/docs/code/tty-gravity/main.c +0 -0
  74. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/docs/code/udp-dhcp/main.c +0 -0
  75. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/docs/code/uvcat/main.c +0 -0
  76. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/docs/code/uvstop/main.c +0 -0
  77. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/docs/code/uvtee/main.c +0 -0
  78. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/docs/code/uvwget/main.c +0 -0
  79. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/docs/make.bat +0 -0
  80. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/docs/requirements.txt +0 -0
  81. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/docs/src/api.rst +0 -0
  82. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/docs/src/async.rst +0 -0
  83. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/docs/src/check.rst +0 -0
  84. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/docs/src/conf.py +0 -0
  85. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/docs/src/design.rst +0 -0
  86. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/docs/src/dll.rst +0 -0
  87. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/docs/src/dns.rst +0 -0
  88. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/docs/src/errors.rst +0 -0
  89. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/docs/src/fs.rst +0 -0
  90. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/docs/src/fs_event.rst +0 -0
  91. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/docs/src/fs_poll.rst +0 -0
  92. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/docs/src/guide/about.rst +0 -0
  93. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/docs/src/guide/basics.rst +0 -0
  94. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/docs/src/guide/eventloops.rst +0 -0
  95. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/docs/src/guide/filesystem.rst +0 -0
  96. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/docs/src/guide/introduction.rst +0 -0
  97. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/docs/src/guide/networking.rst +0 -0
  98. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/docs/src/guide/processes.rst +0 -0
  99. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/docs/src/guide/threads.rst +0 -0
  100. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/docs/src/guide/utilities.rst +0 -0
  101. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/docs/src/guide.rst +0 -0
  102. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/docs/src/handle.rst +0 -0
  103. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/docs/src/idle.rst +0 -0
  104. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/docs/src/index.rst +0 -0
  105. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/docs/src/loop.rst +0 -0
  106. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/docs/src/metrics.rst +0 -0
  107. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/docs/src/migration_010_100.rst +0 -0
  108. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/docs/src/misc.rst +0 -0
  109. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/docs/src/pipe.rst +0 -0
  110. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/docs/src/poll.rst +0 -0
  111. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/docs/src/prepare.rst +0 -0
  112. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/docs/src/process.rst +0 -0
  113. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/docs/src/request.rst +0 -0
  114. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/docs/src/signal.rst +0 -0
  115. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/docs/src/sphinx-plugins/manpage.py +0 -0
  116. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/docs/src/static/architecture.png +0 -0
  117. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/docs/src/static/diagrams.key/Data/st0-311.jpg +0 -0
  118. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/docs/src/static/diagrams.key/Data/st1-475.jpg +0 -0
  119. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/docs/src/static/diagrams.key/Index.zip +0 -0
  120. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/docs/src/static/diagrams.key/Metadata/BuildVersionHistory.plist +0 -0
  121. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/docs/src/static/diagrams.key/Metadata/DocumentIdentifier +0 -0
  122. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/docs/src/static/diagrams.key/Metadata/Properties.plist +0 -0
  123. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/docs/src/static/diagrams.key/preview-micro.jpg +0 -0
  124. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/docs/src/static/diagrams.key/preview-web.jpg +0 -0
  125. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/docs/src/static/diagrams.key/preview.jpg +0 -0
  126. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/docs/src/static/favicon.ico +0 -0
  127. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/docs/src/static/logo.png +0 -0
  128. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/docs/src/static/loop_iteration.png +0 -0
  129. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/docs/src/stream.rst +0 -0
  130. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/docs/src/tcp.rst +0 -0
  131. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/docs/src/threading.rst +0 -0
  132. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/docs/src/threadpool.rst +0 -0
  133. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/docs/src/timer.rst +0 -0
  134. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/docs/src/tty.rst +0 -0
  135. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/docs/src/udp.rst +0 -0
  136. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/docs/src/upgrading.rst +0 -0
  137. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/docs/src/version.rst +0 -0
  138. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/img/banner.png +0 -0
  139. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/img/logos.svg +0 -0
  140. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/include/uv/aix.h +0 -0
  141. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/include/uv/bsd.h +0 -0
  142. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/include/uv/darwin.h +0 -0
  143. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/include/uv/errno.h +0 -0
  144. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/include/uv/linux.h +0 -0
  145. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/include/uv/os390.h +0 -0
  146. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/include/uv/posix.h +0 -0
  147. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/include/uv/sunos.h +0 -0
  148. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/include/uv/threadpool.h +0 -0
  149. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/include/uv/tree.h +0 -0
  150. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/include/uv/unix.h +0 -0
  151. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/include/uv/version.h +0 -0
  152. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/include/uv/win.h +0 -0
  153. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/include/uv.h +0 -0
  154. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/libuv-static.pc.in +0 -0
  155. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/libuv.pc.in +0 -0
  156. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/m4/.gitignore +0 -0
  157. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/m4/as_case.m4 +0 -0
  158. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/m4/ax_pthread.m4 +0 -0
  159. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/m4/libuv-check-flags.m4 +0 -0
  160. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/src/fs-poll.c +0 -0
  161. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/src/heap-inl.h +0 -0
  162. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/src/idna.c +0 -0
  163. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/src/idna.h +0 -0
  164. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/src/inet.c +0 -0
  165. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/src/queue.h +0 -0
  166. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/src/random.c +0 -0
  167. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/src/strscpy.c +0 -0
  168. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/src/strscpy.h +0 -0
  169. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/src/strtok.c +0 -0
  170. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/src/strtok.h +0 -0
  171. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/src/thread-common.c +0 -0
  172. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/src/threadpool.c +0 -0
  173. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/src/timer.c +0 -0
  174. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/src/unix/aix-common.c +0 -0
  175. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/src/unix/aix.c +0 -0
  176. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/src/unix/async.c +0 -0
  177. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/src/unix/bsd-ifaddrs.c +0 -0
  178. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/src/unix/bsd-proctitle.c +0 -0
  179. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/src/unix/core.c +0 -0
  180. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/src/unix/cygwin.c +0 -0
  181. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/src/unix/darwin-proctitle.c +0 -0
  182. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/src/unix/darwin-stub.h +0 -0
  183. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/src/unix/darwin-syscalls.h +0 -0
  184. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/src/unix/darwin.c +0 -0
  185. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/src/unix/dl.c +0 -0
  186. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/src/unix/freebsd.c +0 -0
  187. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/src/unix/fs.c +0 -0
  188. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/src/unix/fsevents.c +0 -0
  189. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/src/unix/getaddrinfo.c +0 -0
  190. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/src/unix/getnameinfo.c +0 -0
  191. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/src/unix/haiku.c +0 -0
  192. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/src/unix/hurd.c +0 -0
  193. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/src/unix/ibmi.c +0 -0
  194. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/src/unix/internal.h +0 -0
  195. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/src/unix/kqueue.c +0 -0
  196. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/src/unix/linux.c +0 -0
  197. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/src/unix/loop-watcher.c +0 -0
  198. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/src/unix/loop.c +0 -0
  199. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/src/unix/netbsd.c +0 -0
  200. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/src/unix/no-fsevents.c +0 -0
  201. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/src/unix/no-proctitle.c +0 -0
  202. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/src/unix/openbsd.c +0 -0
  203. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/src/unix/os390-proctitle.c +0 -0
  204. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/src/unix/os390-syscalls.c +0 -0
  205. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/src/unix/os390-syscalls.h +0 -0
  206. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/src/unix/os390.c +0 -0
  207. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/src/unix/pipe.c +0 -0
  208. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/src/unix/poll.c +0 -0
  209. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/src/unix/posix-hrtime.c +0 -0
  210. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/src/unix/posix-poll.c +0 -0
  211. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/src/unix/process.c +0 -0
  212. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/src/unix/procfs-exepath.c +0 -0
  213. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/src/unix/proctitle.c +0 -0
  214. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/src/unix/qnx.c +0 -0
  215. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/src/unix/random-devurandom.c +0 -0
  216. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/src/unix/random-getentropy.c +0 -0
  217. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/src/unix/random-getrandom.c +0 -0
  218. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/src/unix/random-sysctl-linux.c +0 -0
  219. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/src/unix/signal.c +0 -0
  220. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/src/unix/stream.c +0 -0
  221. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/src/unix/sunos.c +0 -0
  222. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/src/unix/sysinfo-loadavg.c +0 -0
  223. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/src/unix/sysinfo-memory.c +0 -0
  224. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/src/unix/tcp.c +0 -0
  225. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/src/unix/thread.c +0 -0
  226. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/src/unix/tty.c +0 -0
  227. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/src/unix/udp.c +0 -0
  228. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/src/uv-common.c +0 -0
  229. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/src/uv-common.h +0 -0
  230. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/src/uv-data-getter-setters.c +0 -0
  231. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/src/version.c +0 -0
  232. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/src/win/async.c +0 -0
  233. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/src/win/atomicops-inl.h +0 -0
  234. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/src/win/core.c +0 -0
  235. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/src/win/detect-wakeup.c +0 -0
  236. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/src/win/dl.c +0 -0
  237. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/src/win/error.c +0 -0
  238. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/src/win/fs-event.c +0 -0
  239. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/src/win/fs-fd-hash-inl.h +0 -0
  240. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/src/win/fs.c +0 -0
  241. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/src/win/getaddrinfo.c +0 -0
  242. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/src/win/getnameinfo.c +0 -0
  243. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/src/win/handle-inl.h +0 -0
  244. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/src/win/handle.c +0 -0
  245. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/src/win/internal.h +0 -0
  246. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/src/win/loop-watcher.c +0 -0
  247. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/src/win/pipe.c +0 -0
  248. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/src/win/poll.c +0 -0
  249. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/src/win/process-stdio.c +0 -0
  250. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/src/win/process.c +0 -0
  251. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/src/win/req-inl.h +0 -0
  252. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/src/win/signal.c +0 -0
  253. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/src/win/snprintf.c +0 -0
  254. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/src/win/stream-inl.h +0 -0
  255. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/src/win/stream.c +0 -0
  256. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/src/win/tcp.c +0 -0
  257. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/src/win/thread.c +0 -0
  258. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/src/win/tty.c +0 -0
  259. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/src/win/udp.c +0 -0
  260. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/src/win/util.c +0 -0
  261. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/src/win/winapi.c +0 -0
  262. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/src/win/winapi.h +0 -0
  263. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/src/win/winsock.c +0 -0
  264. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/src/win/winsock.h +0 -0
  265. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/benchmark-async-pummel.c +0 -0
  266. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/benchmark-async.c +0 -0
  267. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/benchmark-fs-stat.c +0 -0
  268. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/benchmark-getaddrinfo.c +0 -0
  269. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/benchmark-list.h +0 -0
  270. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/benchmark-loop-count.c +0 -0
  271. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/benchmark-million-async.c +0 -0
  272. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/benchmark-million-timers.c +0 -0
  273. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/benchmark-multi-accept.c +0 -0
  274. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/benchmark-ping-pongs.c +0 -0
  275. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/benchmark-ping-udp.c +0 -0
  276. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/benchmark-pound.c +0 -0
  277. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/benchmark-pump.c +0 -0
  278. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/benchmark-queue-work.c +0 -0
  279. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/benchmark-sizes.c +0 -0
  280. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/benchmark-spawn.c +0 -0
  281. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/benchmark-tcp-write-batch.c +0 -0
  282. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/benchmark-thread.c +0 -0
  283. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/benchmark-udp-pummel.c +0 -0
  284. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/blackhole-server.c +0 -0
  285. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/echo-server.c +0 -0
  286. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/fixtures/empty_file +0 -0
  287. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/fixtures/load_error.node +0 -0
  288. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/fixtures/lorem_ipsum.txt +0 -0
  289. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/fixtures/one_file/one_file +0 -0
  290. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/run-benchmarks.c +0 -0
  291. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/run-tests.c +0 -0
  292. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/runner-unix.c +0 -0
  293. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/runner-unix.h +0 -0
  294. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/runner-win.c +0 -0
  295. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/runner-win.h +0 -0
  296. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/runner.c +0 -0
  297. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/runner.h +0 -0
  298. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/task.h +0 -0
  299. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-active.c +0 -0
  300. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-async-null-cb.c +0 -0
  301. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-async.c +0 -0
  302. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-barrier.c +0 -0
  303. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-callback-stack.c +0 -0
  304. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-close-fd.c +0 -0
  305. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-close-order.c +0 -0
  306. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-condvar.c +0 -0
  307. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-connect-unspecified.c +0 -0
  308. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-connection-fail.c +0 -0
  309. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-cwd-and-chdir.c +0 -0
  310. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-default-loop-close.c +0 -0
  311. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-delayed-accept.c +0 -0
  312. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-dlerror.c +0 -0
  313. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-eintr-handling.c +0 -0
  314. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-embed.c +0 -0
  315. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-emfile.c +0 -0
  316. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-env-vars.c +0 -0
  317. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-error.c +0 -0
  318. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-fail-always.c +0 -0
  319. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-fork.c +0 -0
  320. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-fs-copyfile.c +0 -0
  321. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-fs-event.c +0 -0
  322. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-fs-fd-hash.c +0 -0
  323. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-fs-open-flags.c +0 -0
  324. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-fs-poll.c +0 -0
  325. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-fs-readdir.c +0 -0
  326. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-fs.c +0 -0
  327. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-get-currentexe.c +0 -0
  328. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-get-loadavg.c +0 -0
  329. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-get-memory.c +0 -0
  330. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-get-passwd.c +0 -0
  331. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-getaddrinfo.c +0 -0
  332. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-gethostname.c +0 -0
  333. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-getnameinfo.c +0 -0
  334. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-getsockname.c +0 -0
  335. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-getters-setters.c +0 -0
  336. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-gettimeofday.c +0 -0
  337. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-handle-fileno.c +0 -0
  338. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-homedir.c +0 -0
  339. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-hrtime.c +0 -0
  340. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-idle.c +0 -0
  341. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-idna.c +0 -0
  342. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-iouring-pollhup.c +0 -0
  343. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-ip-name.c +0 -0
  344. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-ip4-addr.c +0 -0
  345. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-ip6-addr.c +0 -0
  346. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-ipc-heavy-traffic-deadlock-bug.c +0 -0
  347. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-ipc-send-recv.c +0 -0
  348. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-ipc.c +0 -0
  349. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-list.h +0 -0
  350. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-loop-alive.c +0 -0
  351. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-loop-close.c +0 -0
  352. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-loop-configure.c +0 -0
  353. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-loop-handles.c +0 -0
  354. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-loop-oom.c +0 -0
  355. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-loop-stop.c +0 -0
  356. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-loop-time.c +0 -0
  357. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-metrics.c +0 -0
  358. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-multiple-listen.c +0 -0
  359. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-mutexes.c +0 -0
  360. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-not-readable-nor-writable-on-read-error.c +0 -0
  361. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-not-writable-after-shutdown.c +0 -0
  362. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-osx-select.c +0 -0
  363. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-pass-always.c +0 -0
  364. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-ping-pong.c +0 -0
  365. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-pipe-bind-error.c +0 -0
  366. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-pipe-close-stdout-read-stdin.c +0 -0
  367. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-pipe-connect-error.c +0 -0
  368. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-pipe-connect-multiple.c +0 -0
  369. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-pipe-connect-prepare.c +0 -0
  370. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-pipe-getsockname.c +0 -0
  371. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-pipe-pending-instances.c +0 -0
  372. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-pipe-sendmsg.c +0 -0
  373. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-pipe-server-close.c +0 -0
  374. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-pipe-set-fchmod.c +0 -0
  375. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-pipe-set-non-blocking.c +0 -0
  376. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-platform-output.c +0 -0
  377. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-poll-close-doesnt-corrupt-stack.c +0 -0
  378. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-poll-close.c +0 -0
  379. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-poll-closesocket.c +0 -0
  380. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-poll-multiple-handles.c +0 -0
  381. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-poll-oob.c +0 -0
  382. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-poll.c +0 -0
  383. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-process-priority.c +0 -0
  384. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-process-title-threadsafe.c +0 -0
  385. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-process-title.c +0 -0
  386. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-queue-foreach-delete.c +0 -0
  387. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-random.c +0 -0
  388. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-readable-on-eof.c +0 -0
  389. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-ref.c +0 -0
  390. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-run-nowait.c +0 -0
  391. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-run-once.c +0 -0
  392. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-semaphore.c +0 -0
  393. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-shutdown-close.c +0 -0
  394. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-shutdown-eof.c +0 -0
  395. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-shutdown-simultaneous.c +0 -0
  396. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-shutdown-twice.c +0 -0
  397. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-signal-multiple-loops.c +0 -0
  398. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-signal-pending-on-close.c +0 -0
  399. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-signal.c +0 -0
  400. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-socket-buffer-size.c +0 -0
  401. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-spawn.c +0 -0
  402. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-stdio-over-pipes.c +0 -0
  403. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-strscpy.c +0 -0
  404. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-strtok.c +0 -0
  405. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-tcp-alloc-cb-fail.c +0 -0
  406. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-tcp-bind-error.c +0 -0
  407. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-tcp-bind6-error.c +0 -0
  408. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-tcp-close-accept.c +0 -0
  409. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-tcp-close-after-read-timeout.c +0 -0
  410. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-tcp-close-reset.c +0 -0
  411. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-tcp-close-while-connecting.c +0 -0
  412. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-tcp-close.c +0 -0
  413. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-tcp-connect-error-after-write.c +0 -0
  414. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-tcp-connect-error.c +0 -0
  415. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-tcp-connect-timeout.c +0 -0
  416. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-tcp-connect6-error.c +0 -0
  417. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-tcp-create-socket-early.c +0 -0
  418. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-tcp-flags.c +0 -0
  419. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-tcp-oob.c +0 -0
  420. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-tcp-open.c +0 -0
  421. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-tcp-read-stop-start.c +0 -0
  422. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-tcp-read-stop.c +0 -0
  423. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-tcp-reuseport.c +0 -0
  424. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-tcp-rst.c +0 -0
  425. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-tcp-shutdown-after-write.c +0 -0
  426. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-tcp-try-write-error.c +0 -0
  427. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-tcp-try-write.c +0 -0
  428. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-tcp-unexpected-read.c +0 -0
  429. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-tcp-write-after-connect.c +0 -0
  430. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-tcp-write-fail.c +0 -0
  431. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-tcp-write-in-a-row.c +0 -0
  432. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-tcp-write-queue-order.c +0 -0
  433. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-tcp-write-to-half-open-connection.c +0 -0
  434. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-tcp-writealot.c +0 -0
  435. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-test-macros.c +0 -0
  436. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-thread-affinity.c +0 -0
  437. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-thread-equal.c +0 -0
  438. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-thread-name.c +0 -0
  439. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-thread-priority.c +0 -0
  440. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-thread.c +0 -0
  441. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-threadpool-cancel.c +0 -0
  442. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-threadpool.c +0 -0
  443. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-timer-again.c +0 -0
  444. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-timer-from-check.c +0 -0
  445. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-timer.c +0 -0
  446. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-tmpdir.c +0 -0
  447. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-tty-duplicate-key.c +0 -0
  448. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-tty-escape-sequence-processing.c +0 -0
  449. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-tty.c +0 -0
  450. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-udp-alloc-cb-fail.c +0 -0
  451. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-udp-bind.c +0 -0
  452. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-udp-connect.c +0 -0
  453. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-udp-connect6.c +0 -0
  454. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-udp-create-socket-early.c +0 -0
  455. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-udp-dgram-too-big.c +0 -0
  456. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-udp-ipv6.c +0 -0
  457. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-udp-mmsg.c +0 -0
  458. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-udp-multicast-interface.c +0 -0
  459. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-udp-multicast-interface6.c +0 -0
  460. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-udp-multicast-join.c +0 -0
  461. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-udp-multicast-join6.c +0 -0
  462. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-udp-multicast-ttl.c +0 -0
  463. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-udp-open.c +0 -0
  464. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-udp-options.c +0 -0
  465. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-udp-recv-in-a-row.c +0 -0
  466. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-udp-reuseport.c +0 -0
  467. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-udp-send-and-recv.c +0 -0
  468. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-udp-send-hang-loop.c +0 -0
  469. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-udp-send-immediate.c +0 -0
  470. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-udp-send-unreachable.c +0 -0
  471. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-udp-sendmmsg-error.c +0 -0
  472. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-udp-try-send.c +0 -0
  473. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-uname.c +0 -0
  474. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-walk-handles.c +0 -0
  475. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-watcher-cross-stop.c +0 -0
  476. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/tools/make_dist_html.py +0 -0
  477. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/tools/vswhere_usability_wrapper.cmd +0 -0
  478. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/tsansupp.txt +0 -0
  479. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/uv_win_longpath.manifest +0 -0
  480. {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/update-libuv.sh +0 -0
  481. {zuvloop-0.0.2 → zuvloop-0.0.3}/zig/addr.zig +0 -0
  482. {zuvloop-0.0.2 → zuvloop-0.0.3}/zig/c.zig +0 -0
  483. {zuvloop-0.0.2 → zuvloop-0.0.3}/zig/collections.zig +0 -0
  484. {zuvloop-0.0.2 → zuvloop-0.0.3}/zig/datagram.zig +0 -0
  485. {zuvloop-0.0.2 → zuvloop-0.0.3}/zig/dns.zig +0 -0
  486. {zuvloop-0.0.2 → zuvloop-0.0.3}/zig/handle.zig +0 -0
  487. {zuvloop-0.0.2 → zuvloop-0.0.3}/zig/loop.zig +0 -0
  488. {zuvloop-0.0.2 → zuvloop-0.0.3}/zig/module.zig +0 -0
  489. {zuvloop-0.0.2 → zuvloop-0.0.3}/zig/poller.zig +0 -0
  490. {zuvloop-0.0.2 → zuvloop-0.0.3}/zig/process.zig +0 -0
  491. {zuvloop-0.0.2 → zuvloop-0.0.3}/zig/py.zig +0 -0
  492. {zuvloop-0.0.2 → zuvloop-0.0.3}/zig/timer.zig +0 -0
  493. {zuvloop-0.0.2 → zuvloop-0.0.3}/zig/tshandle.zig +0 -0
  494. {zuvloop-0.0.2 → zuvloop-0.0.3}/zig/uv.zig +0 -0
  495. {zuvloop-0.0.2 → zuvloop-0.0.3}/zuvloop/__init__.py +0 -0
  496. {zuvloop-0.0.2 → zuvloop-0.0.3}/zuvloop/_loop.py +0 -0
  497. {zuvloop-0.0.2 → zuvloop-0.0.3}/zuvloop/_process.py +0 -0
  498. {zuvloop-0.0.2 → zuvloop-0.0.3}/zuvloop/_runner.py +0 -0
  499. {zuvloop-0.0.2 → zuvloop-0.0.3}/zuvloop/_server.py +0 -0
  500. {zuvloop-0.0.2 → zuvloop-0.0.3}/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.3
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`
@@ -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`
@@ -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", "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
 
@@ -1005,6 +1005,10 @@ fn forceCloseMethod(self_obj: *py.Object, exc: *py.Object) py.Error!*py.Object {
1005
1005
  return py.noneRef();
1006
1006
  }
1007
1007
 
1008
+ fn getProtocolPaused(self_obj: ?*py.Object, _: ?*anyopaque) callconv(.c) ?*py.Object {
1009
+ return py.boolRef(asTransport(self_obj.?).flags & PROTOCOL_PAUSED != 0);
1010
+ }
1011
+
1008
1012
  // ---------------------------------------------------------------------------
1009
1013
  // construction
1010
1014
 
@@ -1225,12 +1229,19 @@ var methods = [_]c.PyMethodDef{
1225
1229
  py.sentinel,
1226
1230
  };
1227
1231
 
1232
+ // asyncio's name for this state; its sendfile machinery reads it off transports.
1233
+ var getsets = [_]c.PyGetSetDef{
1234
+ .{ .name = "_protocol_paused", .get = getProtocolPaused, .set = null, .doc = "Whether flow control has paused the protocol.", .closure = null },
1235
+ .{ .name = null, .get = null, .set = null, .doc = null, .closure = null },
1236
+ };
1237
+
1228
1238
  var slots = [_]c.PyType_Slot{
1229
1239
  .{ .slot = c.Py_tp_dealloc, .pfunc = @ptrCast(@constCast(&dealloc)) },
1230
1240
  .{ .slot = c.Py_tp_traverse, .pfunc = @ptrCast(@constCast(&traverse)) },
1231
1241
  .{ .slot = c.Py_tp_clear, .pfunc = @ptrCast(@constCast(&clear_)) },
1232
1242
  .{ .slot = c.Py_tp_repr, .pfunc = @ptrCast(@constCast(&repr)) },
1233
1243
  .{ .slot = c.Py_tp_methods, .pfunc = @ptrCast(&methods) },
1244
+ .{ .slot = c.Py_tp_getset, .pfunc = @ptrCast(&getsets) },
1234
1245
  .{ .slot = c.Py_tp_doc, .pfunc = @ptrCast(@constCast("A libuv-backed stream transport.")) },
1235
1246
  .{ .slot = 0, .pfunc = null },
1236
1247
  };
@@ -36,8 +36,10 @@ class LoopBase(_zuvloop.Loop, asyncio.AbstractEventLoop): # type: ignore[misc]
36
36
  orchestration that runs once per loop or once per connection.
37
37
  """
38
38
 
39
- # How often the loop gauges are sampled while a real OpenTelemetry meter
40
- # provider is installed. Assign before running the loop to change it.
39
+ # How often the native sampler fires while the loop runs. It publishes the
40
+ # loop gauges when a meter provider is installed, and it is also how quickly
41
+ # a provider configured after the loop started is noticed. Assign before
42
+ # running the loop to change it.
41
43
  metrics_interval: float = 10.0
42
44
 
43
45
  def __init__(self) -> None:
@@ -52,6 +54,8 @@ class LoopBase(_zuvloop.Loop, asyncio.AbstractEventLoop): # type: ignore[misc]
52
54
  self._sock_watchers: dict[tuple[int, bool], object] = {}
53
55
  self._wakeup_fd_attached = False
54
56
  self._instrumentation = Instrumentation()
57
+ self._monitoring_armed = False
58
+ self._metrics_armed = False
55
59
  self._setup_self_pipe()
56
60
 
57
61
  def __del__(self, _warn: Callable[..., object] = warnings.warn) -> None:
@@ -100,11 +104,10 @@ class LoopBase(_zuvloop.Loop, asyncio.AbstractEventLoop): # type: ignore[misc]
100
104
  self._attach_wakeup_fd()
101
105
  _events._set_running_loop(self)
102
106
  sys.set_asyncgen_hooks(firstiter=self._asyncgen_firstiter, finalizer=self._asyncgen_finalizer)
103
- # Gauges cost nothing to skip and something to sample, so the sampler
104
- # runs exactly when there is somewhere for the numbers to go.
105
- if metrics_provider_installed():
106
- self._start_metrics(self.metrics_interval, publish_metrics)
107
- self._set_slow_callback_monitoring(instrumentation_provider_installed())
107
+ self._monitoring_armed = instrumentation_provider_installed()
108
+ self._metrics_armed = metrics_provider_installed()
109
+ self._set_slow_callback_monitoring(self._monitoring_armed)
110
+ self._start_metrics(self.metrics_interval, self._on_sample)
108
111
  try:
109
112
  self._run()
110
113
  finally:
@@ -253,6 +256,15 @@ class LoopBase(_zuvloop.Loop, asyncio.AbstractEventLoop): # type: ignore[misc]
253
256
  def _on_slow_callback(self, handle: object, duration: float) -> None:
254
257
  self._instrumentation.report_slow_callback(handle, duration)
255
258
 
259
+ def _on_sample(self, snapshot: dict[str, int]) -> None:
260
+ if not self._monitoring_armed and instrumentation_provider_installed():
261
+ self._monitoring_armed = True
262
+ self._set_slow_callback_monitoring(True)
263
+ if not self._metrics_armed:
264
+ self._metrics_armed = metrics_provider_installed()
265
+ if self._metrics_armed:
266
+ publish_metrics(snapshot)
267
+
256
268
  # -- internals ---------------------------------------------------------
257
269
 
258
270
  def _check_closed(self) -> None:
@@ -15,15 +15,15 @@ from typing import Any, cast
15
15
 
16
16
  from . import _zuvloop
17
17
  from ._process import Popen
18
+ from ._sendfile import SendfileOperations
18
19
  from ._server import Server
19
- from ._sockets import SocketOperations
20
20
 
21
21
  # What `getaddrinfo` hands back: family, kind, protocol, canonical name, address.
22
22
  type _AddrInfo = tuple[int, int, int, str, tuple[str, int] | tuple[str, int, int, int]]
23
23
  _SSLArg = ssl_module.SSLContext | bool | None
24
24
 
25
25
 
26
- class ConnectionOperations(SocketOperations):
26
+ class ConnectionOperations(SendfileOperations):
27
27
  """Connection and server setup.
28
28
 
29
29
  Sockets are created and bound here; once connected the descriptor is handed
@@ -64,10 +64,10 @@ class Instrumentation:
64
64
  "code.callback": repr(handle),
65
65
  "duration": duration,
66
66
  "asyncio.call_graph": capture_call_graph(handle),
67
+ "logfire.level_num": 13,
67
68
  }
68
69
  ),
69
70
  )
70
- span.set_status(Status(StatusCode.ERROR, "callback exceeded slow_callback_duration"))
71
71
  span.end(end_time=ended)
72
72
 
73
73
  def report_exception(self, context: dict[str, Any]) -> None:
@@ -0,0 +1,268 @@
1
+ from __future__ import annotations
2
+
3
+ import asyncio
4
+ import errno
5
+ import os
6
+ import socket
7
+ import ssl
8
+ from asyncio.constants import _SendfileMode
9
+ from typing import IO, cast
10
+
11
+ from . import _zuvloop
12
+ from ._sockets import SocketOperations
13
+
14
+ # CPython's fallback read sizes: large reads straight to a socket, smaller ones
15
+ # through a transport so flow control gets a say between chunks.
16
+ _SOCKET_CHUNK = 256 * 1024
17
+ _TRANSPORT_CHUNK = 16 * 1024
18
+
19
+
20
+ class SendfileOperations(SocketOperations):
21
+ """`sendfile()` and `sock_sendfile()`: `os.sendfile` straight to the
22
+ descriptor when the target is a plain socket, chunked writes when it is
23
+ behind TLS or not a regular file."""
24
+
25
+ async def sock_sendfile( # type: ignore[override] # typeshed allows fallback=None
26
+ self, sock: socket.socket, file: IO[bytes], offset: int = 0, count: int | None = None, *, fallback: bool = True
27
+ ) -> int:
28
+ self._check_non_blocking(sock)
29
+ _check_sendfile_params(sock, file, offset, count)
30
+ try:
31
+ return await self._sendfile_to_fd(sock.fileno(), file, offset, count)
32
+ except asyncio.SendfileNotAvailableError:
33
+ if not fallback:
34
+ raise
35
+ return await self._sock_sendfile_fallback(sock, file, offset, count)
36
+
37
+ async def sendfile(
38
+ self,
39
+ transport: asyncio.WriteTransport,
40
+ file: IO[bytes],
41
+ offset: int = 0,
42
+ count: int | None = None,
43
+ *,
44
+ fallback: bool = True,
45
+ ) -> int:
46
+ if transport.is_closing():
47
+ raise RuntimeError("Transport is closing")
48
+ _check_file_params(file, offset, count)
49
+ if isinstance(transport, _zuvloop.Transport):
50
+ sock = transport.get_extra_info("socket")
51
+ if sock is not None:
52
+ try:
53
+ return await self._transport_sendfile_native(transport, sock, file, offset, count)
54
+ except asyncio.SendfileNotAvailableError:
55
+ if not fallback:
56
+ raise
57
+ elif not fallback:
58
+ raise asyncio.SendfileNotAvailableError(f"native sendfile is not supported for transport {transport!r}")
59
+ return await self._sendfile_fallback(transport, file, offset, count)
60
+ mode = getattr(transport, "_sendfile_compatible", _SendfileMode.UNSUPPORTED)
61
+ if mode == _SendfileMode.UNSUPPORTED:
62
+ raise RuntimeError(f"sendfile is not supported for transport {transport!r}")
63
+ if not fallback and mode != _SendfileMode.TRY_NATIVE:
64
+ raise RuntimeError(f"fallback is disabled and native sendfile is not supported for transport {transport!r}")
65
+ if not fallback:
66
+ raise asyncio.SendfileNotAvailableError(f"native sendfile is not supported for transport {transport!r}")
67
+ return await self._sendfile_fallback(transport, file, offset, count)
68
+
69
+ async def _transport_sendfile_native(
70
+ self, transport: _zuvloop.Transport, sock: socket.socket, file: IO[bytes], offset: int, count: int | None
71
+ ) -> int:
72
+ # Reject non-regular files before disturbing the transport at all.
73
+ fileno = _regular_fileno(file)
74
+ waiter = _SendfileProtocol(self, transport, transport._protocol_paused)
75
+ low, high = transport.get_write_buffer_limits()
76
+ # With both marks at zero, `resume_writing` fires exactly when libuv has
77
+ # handed the last buffered byte to the socket - the point after which
78
+ # writing to the descriptor directly cannot reorder data.
79
+ transport.set_write_buffer_limits(high=0, low=0)
80
+ try:
81
+ if transport.get_write_buffer_size() > 0:
82
+ await waiter.drain()
83
+ # libuv allows one handle per descriptor, so readiness is polled
84
+ # through a duplicate; both name the same socket.
85
+ fd = os.dup(sock.fileno())
86
+ try:
87
+ return await self._sendfile_to_fd(fd, file, offset, count, fileno)
88
+ finally:
89
+ os.close(fd)
90
+ finally:
91
+ transport.set_write_buffer_limits(high=high, low=low)
92
+ waiter.restore()
93
+
94
+ async def _sendfile_to_fd(
95
+ self, fd: int, file: IO[bytes], offset: int, count: int | None, fileno: int | None = None
96
+ ) -> int:
97
+ if fileno is None:
98
+ fileno = _regular_fileno(file)
99
+ blocksize = count if count is not None else os.fstat(fileno).st_size
100
+ total_sent = 0
101
+ try:
102
+ while blocksize > 0:
103
+ try:
104
+ sent = cast("int", await self._retry_ready(fd, True, os.sendfile, (fd, fileno, offset, blocksize)))
105
+ except OSError as exc:
106
+ if total_sent == 0:
107
+ # The main reason to get here is `file` not being a
108
+ # regular mmap-able file; the fallback's plain writes
109
+ # will either work or report the real failure.
110
+ raise asyncio.SendfileNotAvailableError("os.sendfile call failed") from exc
111
+ if exc.errno == errno.ENOTCONN and not isinstance(exc, ConnectionError):
112
+ # A disconnect surfaces as ENOTCONN on some platforms;
113
+ # every caller should see it as the same failure.
114
+ raise ConnectionError("socket is not connected", errno.ENOTCONN) from exc
115
+ raise
116
+ if sent == 0:
117
+ break
118
+ offset += sent
119
+ total_sent += sent
120
+ if count is not None:
121
+ blocksize = count - total_sent
122
+ return total_sent
123
+ finally:
124
+ if total_sent > 0:
125
+ os.lseek(fileno, offset, os.SEEK_SET)
126
+
127
+ async def _sock_sendfile_fallback(
128
+ self, sock: socket.socket, file: IO[bytes], offset: int, count: int | None
129
+ ) -> int:
130
+ if offset:
131
+ file.seek(offset)
132
+ blocksize = min(count, _SOCKET_CHUNK) if count is not None else _SOCKET_CHUNK
133
+ total_sent = 0
134
+ try:
135
+ while blocksize > 0:
136
+ data = await self.run_in_executor(None, file.read, blocksize)
137
+ if not data:
138
+ break
139
+ await self.sock_sendall(sock, data)
140
+ total_sent += len(data)
141
+ if count is not None:
142
+ blocksize = min(count - total_sent, _SOCKET_CHUNK)
143
+ return total_sent
144
+ finally:
145
+ if total_sent > 0 and hasattr(file, "seek"):
146
+ file.seek(offset + total_sent)
147
+
148
+ async def _sendfile_fallback(
149
+ self, transport: asyncio.WriteTransport, file: IO[bytes], offset: int, count: int | None
150
+ ) -> int:
151
+ if offset:
152
+ file.seek(offset)
153
+ blocksize = min(count, _TRANSPORT_CHUNK) if count is not None else _TRANSPORT_CHUNK
154
+ total_sent = 0
155
+ waiter = _SendfileProtocol(self, transport, bool(getattr(transport, "_protocol_paused", False)))
156
+ try:
157
+ while blocksize > 0:
158
+ data = await self.run_in_executor(None, file.read, blocksize)
159
+ if not data:
160
+ break
161
+ await waiter.drain()
162
+ transport.write(data)
163
+ total_sent += len(data)
164
+ if count is not None:
165
+ blocksize = min(count - total_sent, _TRANSPORT_CHUNK)
166
+ return total_sent
167
+ finally:
168
+ if total_sent > 0 and hasattr(file, "seek"):
169
+ file.seek(offset + total_sent)
170
+ waiter.restore()
171
+
172
+
173
+ class _SendfileProtocol(asyncio.Protocol):
174
+ """Stands in for the transport's protocol while `sendfile()` owns the stream.
175
+
176
+ Reading pauses for the duration; writability is answered through the flow
177
+ control callbacks the transport already makes. `restore()` reinstates the
178
+ real protocol and replays the flow-control state it last saw.
179
+ """
180
+
181
+ def __init__(self, loop: SendfileOperations, transport: asyncio.WriteTransport, paused: bool) -> None:
182
+ self._loop = loop
183
+ self._transport = cast("asyncio.Transport", transport)
184
+ self._protocol = self._transport.get_protocol()
185
+ self._should_resume_reading = self._transport.is_reading()
186
+ self._should_resume_writing = paused
187
+ self._waiter: asyncio.Future[None] | None = loop.create_future() if paused else None
188
+ self._transport.pause_reading()
189
+ self._transport.set_protocol(self)
190
+
191
+ def connection_made(self, transport: asyncio.BaseTransport) -> None:
192
+ raise RuntimeError("Invalid state: connection should have been established already")
193
+
194
+ def connection_lost(self, exc: Exception | None) -> None:
195
+ if self._waiter is not None and not self._waiter.done():
196
+ self._waiter.set_exception(exc if exc is not None else ConnectionError("Connection is closed by peer"))
197
+ self._protocol.connection_lost(exc)
198
+
199
+ def data_received(self, data: bytes) -> None:
200
+ raise RuntimeError("Invalid state: reading should be paused")
201
+
202
+ def eof_received(self) -> bool:
203
+ raise RuntimeError("Invalid state: reading should be paused")
204
+
205
+ def pause_writing(self) -> None:
206
+ if self._waiter is None:
207
+ self._waiter = self._loop.create_future()
208
+
209
+ def resume_writing(self) -> None:
210
+ if self._waiter is not None:
211
+ self._waiter.set_result(None)
212
+ self._waiter = None
213
+
214
+ async def drain(self) -> None:
215
+ if self._transport.is_closing():
216
+ raise ConnectionError("Connection closed by peer")
217
+ if self._waiter is not None:
218
+ await self._waiter
219
+
220
+ def restore(self) -> None:
221
+ self._transport.set_protocol(self._protocol)
222
+ if self._should_resume_reading:
223
+ self._transport.resume_reading()
224
+ if self._waiter is not None:
225
+ if not self._waiter.done():
226
+ self._waiter.cancel()
227
+ elif not self._waiter.cancelled():
228
+ # A failure connection_lost() recorded that nobody awaited
229
+ # would otherwise be reported as an unretrieved exception.
230
+ self._waiter.exception()
231
+ self._waiter = None
232
+ # A transport still over its high-water mark delivers its own
233
+ # resume_writing() once it drains; replaying one now would be an
234
+ # invitation to write into the backlog.
235
+ if self._should_resume_writing and not getattr(self._transport, "_protocol_paused", False):
236
+ self._protocol.resume_writing()
237
+
238
+
239
+ def _check_sendfile_params(sock: socket.socket, file: IO[bytes], offset: int, count: int | None) -> None:
240
+ if isinstance(sock, ssl.SSLSocket):
241
+ raise TypeError("Socket cannot be of type SSLSocket")
242
+ if sock.type != socket.SOCK_STREAM:
243
+ raise ValueError("only SOCK_STREAM type sockets are supported")
244
+ _check_file_params(file, offset, count)
245
+
246
+
247
+ def _check_file_params(file: IO[bytes], offset: int, count: int | None) -> None:
248
+ if "b" not in getattr(file, "mode", "b"):
249
+ raise ValueError("file should be opened in binary mode")
250
+ if count is not None:
251
+ if not isinstance(count, int):
252
+ raise TypeError(f"count must be a positive integer (got {count!r})")
253
+ if count <= 0:
254
+ raise ValueError(f"count must be a positive integer (got {count!r})")
255
+ if not isinstance(offset, int):
256
+ raise TypeError(f"offset must be a non-negative integer (got {offset!r})")
257
+ if offset < 0:
258
+ raise ValueError(f"offset must be a non-negative integer (got {offset!r})")
259
+
260
+
261
+ def _regular_fileno(file: IO[bytes]) -> int:
262
+ """The descriptor `os.sendfile` can read, or `SendfileNotAvailableError`."""
263
+ try:
264
+ fileno = file.fileno()
265
+ os.fstat(fileno)
266
+ except (AttributeError, OSError) as exc:
267
+ raise asyncio.SendfileNotAvailableError("not a regular file") from exc
268
+ return fileno
@@ -34,18 +34,23 @@ class SocketOperations(LoopBase):
34
34
  self, sock: socket.socket, op: Callable[..., Any], *args: Any, write: bool = False
35
35
  ) -> Any:
36
36
  """Run `op`, retrying it each time `sock` reports itself ready."""
37
- _check_non_blocking(sock)
37
+ self._check_non_blocking(sock)
38
+ return await self._retry_ready(sock.fileno(), write, op, args)
39
+
40
+ async def _retry_ready(self, fd: int, write: bool, op: Callable[..., Any], args: tuple[Any, ...]) -> Any:
38
41
  future = self.create_future()
39
42
  if _attempt(future, op, args):
40
43
  return await future
41
-
42
- fd = sock.fileno()
43
44
  token = self._watch(fd, write, _attempt, future, op, args)
44
45
  try:
45
46
  return await future
46
47
  finally:
47
48
  self._unwatch(fd, write, token)
48
49
 
50
+ def _check_non_blocking(self, sock: socket.socket) -> None:
51
+ if sock.gettimeout() != 0:
52
+ raise ValueError("the socket must be non-blocking")
53
+
49
54
  async def sock_recv(self, sock: socket.socket, nbytes: int) -> bytes:
50
55
  return await self._retry_until_ready(sock, sock.recv, nbytes) # type: ignore[no-any-return]
51
56
 
@@ -73,7 +78,7 @@ class SocketOperations(LoopBase):
73
78
  sent += await self._retry_until_ready(sock, _send_chunk, sock, view, sent, write=True)
74
79
 
75
80
  async def sock_connect(self, sock: socket.socket, address: Any) -> None:
76
- _check_non_blocking(sock)
81
+ self._check_non_blocking(sock)
77
82
  if sock.family in (socket.AF_INET, socket.AF_INET6):
78
83
  resolved = await self.getaddrinfo(*address[:2], family=sock.family, type=sock.type, proto=sock.proto)
79
84
  address = resolved[0][4]
@@ -101,22 +106,6 @@ class SocketOperations(LoopBase):
101
106
  finally:
102
107
  self._unwatch(fd, True, token)
103
108
 
104
- async def sock_sendfile( # type: ignore[override] # typeshed allows fallback=None
105
- self, sock: socket.socket, file: Any, offset: int = 0, count: int | None = None, *, fallback: bool = True
106
- ) -> int:
107
- raise NotImplementedError("zuvloop does not implement sock_sendfile(); read and sock_sendall() instead")
108
-
109
- async def sendfile(
110
- self,
111
- transport: Any,
112
- file: Any,
113
- offset: int = 0,
114
- count: int | None = None,
115
- *,
116
- fallback: bool = True,
117
- ) -> int:
118
- raise NotImplementedError("zuvloop does not implement sendfile(); write the file contents instead")
119
-
120
109
 
121
110
  def _attempt(future: asyncio.Future[Any], op: Callable[..., Any], args: tuple[Any, ...]) -> bool:
122
111
  """Settle `future` from one attempt at `op`; False means "not ready yet"."""
@@ -142,8 +131,3 @@ def _send_chunk(sock: socket.socket, view: memoryview, sent: int) -> int:
142
131
  def _sendto(sock: socket.socket, data: Any, address: Any) -> int:
143
132
  """Resolved per attempt, not bound once: callers rebind `sendto` between retries."""
144
133
  return sock.sendto(data, address)
145
-
146
-
147
- def _check_non_blocking(sock: socket.socket) -> None:
148
- if sock.gettimeout() != 0:
149
- raise ValueError("the socket must be non-blocking")
@@ -77,6 +77,8 @@ class Process:
77
77
  def send_signal(self, signum: int) -> None: ...
78
78
 
79
79
  class Transport(asyncio.Transport):
80
+ @property
81
+ def _protocol_paused(self) -> bool: ...
80
82
  def _adopt_pipe(self, pipe: Any) -> None: ...
81
83
  def get_extra_info(self, name: str, default: Any = None) -> Any: ...
82
84
  def is_closing(self) -> bool: ...
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes