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.
- {zuvloop-0.0.2 → zuvloop-0.0.3}/PKG-INFO +9 -7
- {zuvloop-0.0.2 → zuvloop-0.0.3}/README.md +8 -6
- {zuvloop-0.0.2 → zuvloop-0.0.3}/pyproject.toml +17 -2
- {zuvloop-0.0.2 → zuvloop-0.0.3}/zig/transport.zig +11 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/zuvloop/_base.py +19 -7
- {zuvloop-0.0.2 → zuvloop-0.0.3}/zuvloop/_connect.py +2 -2
- {zuvloop-0.0.2 → zuvloop-0.0.3}/zuvloop/_instrumentation.py +1 -1
- zuvloop-0.0.3/zuvloop/_sendfile.py +268 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/zuvloop/_sockets.py +9 -25
- {zuvloop-0.0.2 → zuvloop-0.0.3}/zuvloop/_zuvloop.pyi +2 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/.gitignore +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/LICENSE +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/build.zig +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/build.zig.zon +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/README.md +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/.gitattributes +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/.github/ISSUE_TEMPLATE.md +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/.github/dependabot.yml +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/.github/workflows/CI-docs.yml +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/.github/workflows/CI-sample.yml +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/.github/workflows/CI-unix.yml +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/.github/workflows/CI-win.yml +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/.github/workflows/sanitizer.yml +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/.gitignore +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/.mailmap +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/.readthedocs.yaml +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/AUTHORS +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/CMakeLists.txt +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/CONTRIBUTING.md +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/ChangeLog +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/LICENSE +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/LICENSE-docs +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/LICENSE-extra +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/LINKS.md +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/MAINTAINERS.md +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/Makefile.am +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/README.md +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/SECURITY.md +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/SUPPORTED_PLATFORMS.md +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/autogen.sh +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/cmake-toolchains/cross-mingw32.cmake +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/configure.ac +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/docs/code/.gitignore +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/docs/code/CMakeLists.txt +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/docs/code/cgi/main.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/docs/code/cgi/tick.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/docs/code/default-loop/main.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/docs/code/detach/main.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/docs/code/dns/main.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/docs/code/helloworld/main.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/docs/code/idle-basic/main.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/docs/code/idle-compute/main.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/docs/code/interfaces/main.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/docs/code/locks/main.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/docs/code/multi-echo-server/main.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/docs/code/multi-echo-server/worker.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/docs/code/onchange/main.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/docs/code/pipe-echo-server/main.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/docs/code/plugin/hello.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/docs/code/plugin/main.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/docs/code/plugin/plugin.h +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/docs/code/proc-streams/main.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/docs/code/proc-streams/test.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/docs/code/progress/main.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/docs/code/queue-cancel/main.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/docs/code/queue-work/main.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/docs/code/ref-timer/main.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/docs/code/signal/main.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/docs/code/spawn/main.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/docs/code/tcp-echo-server/main.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/docs/code/thread-create/main.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/docs/code/tty/main.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/docs/code/tty-gravity/main.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/docs/code/udp-dhcp/main.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/docs/code/uvcat/main.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/docs/code/uvstop/main.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/docs/code/uvtee/main.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/docs/code/uvwget/main.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/docs/make.bat +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/docs/requirements.txt +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/docs/src/api.rst +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/docs/src/async.rst +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/docs/src/check.rst +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/docs/src/conf.py +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/docs/src/design.rst +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/docs/src/dll.rst +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/docs/src/dns.rst +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/docs/src/errors.rst +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/docs/src/fs.rst +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/docs/src/fs_event.rst +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/docs/src/fs_poll.rst +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/docs/src/guide/about.rst +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/docs/src/guide/basics.rst +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/docs/src/guide/eventloops.rst +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/docs/src/guide/filesystem.rst +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/docs/src/guide/introduction.rst +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/docs/src/guide/networking.rst +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/docs/src/guide/processes.rst +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/docs/src/guide/threads.rst +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/docs/src/guide/utilities.rst +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/docs/src/guide.rst +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/docs/src/handle.rst +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/docs/src/idle.rst +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/docs/src/index.rst +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/docs/src/loop.rst +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/docs/src/metrics.rst +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/docs/src/migration_010_100.rst +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/docs/src/misc.rst +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/docs/src/pipe.rst +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/docs/src/poll.rst +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/docs/src/prepare.rst +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/docs/src/process.rst +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/docs/src/request.rst +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/docs/src/signal.rst +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/docs/src/sphinx-plugins/manpage.py +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/docs/src/static/architecture.png +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/docs/src/static/diagrams.key/Data/st0-311.jpg +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/docs/src/static/diagrams.key/Data/st1-475.jpg +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/docs/src/static/diagrams.key/Index.zip +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/docs/src/static/diagrams.key/Metadata/BuildVersionHistory.plist +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/docs/src/static/diagrams.key/Metadata/DocumentIdentifier +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/docs/src/static/diagrams.key/Metadata/Properties.plist +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/docs/src/static/diagrams.key/preview-micro.jpg +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/docs/src/static/diagrams.key/preview-web.jpg +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/docs/src/static/diagrams.key/preview.jpg +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/docs/src/static/favicon.ico +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/docs/src/static/logo.png +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/docs/src/static/loop_iteration.png +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/docs/src/stream.rst +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/docs/src/tcp.rst +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/docs/src/threading.rst +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/docs/src/threadpool.rst +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/docs/src/timer.rst +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/docs/src/tty.rst +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/docs/src/udp.rst +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/docs/src/upgrading.rst +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/docs/src/version.rst +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/img/banner.png +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/img/logos.svg +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/include/uv/aix.h +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/include/uv/bsd.h +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/include/uv/darwin.h +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/include/uv/errno.h +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/include/uv/linux.h +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/include/uv/os390.h +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/include/uv/posix.h +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/include/uv/sunos.h +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/include/uv/threadpool.h +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/include/uv/tree.h +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/include/uv/unix.h +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/include/uv/version.h +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/include/uv/win.h +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/include/uv.h +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/libuv-static.pc.in +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/libuv.pc.in +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/m4/.gitignore +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/m4/as_case.m4 +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/m4/ax_pthread.m4 +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/m4/libuv-check-flags.m4 +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/src/fs-poll.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/src/heap-inl.h +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/src/idna.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/src/idna.h +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/src/inet.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/src/queue.h +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/src/random.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/src/strscpy.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/src/strscpy.h +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/src/strtok.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/src/strtok.h +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/src/thread-common.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/src/threadpool.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/src/timer.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/src/unix/aix-common.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/src/unix/aix.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/src/unix/async.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/src/unix/bsd-ifaddrs.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/src/unix/bsd-proctitle.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/src/unix/core.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/src/unix/cygwin.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/src/unix/darwin-proctitle.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/src/unix/darwin-stub.h +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/src/unix/darwin-syscalls.h +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/src/unix/darwin.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/src/unix/dl.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/src/unix/freebsd.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/src/unix/fs.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/src/unix/fsevents.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/src/unix/getaddrinfo.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/src/unix/getnameinfo.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/src/unix/haiku.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/src/unix/hurd.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/src/unix/ibmi.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/src/unix/internal.h +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/src/unix/kqueue.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/src/unix/linux.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/src/unix/loop-watcher.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/src/unix/loop.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/src/unix/netbsd.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/src/unix/no-fsevents.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/src/unix/no-proctitle.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/src/unix/openbsd.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/src/unix/os390-proctitle.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/src/unix/os390-syscalls.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/src/unix/os390-syscalls.h +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/src/unix/os390.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/src/unix/pipe.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/src/unix/poll.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/src/unix/posix-hrtime.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/src/unix/posix-poll.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/src/unix/process.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/src/unix/procfs-exepath.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/src/unix/proctitle.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/src/unix/qnx.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/src/unix/random-devurandom.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/src/unix/random-getentropy.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/src/unix/random-getrandom.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/src/unix/random-sysctl-linux.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/src/unix/signal.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/src/unix/stream.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/src/unix/sunos.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/src/unix/sysinfo-loadavg.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/src/unix/sysinfo-memory.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/src/unix/tcp.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/src/unix/thread.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/src/unix/tty.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/src/unix/udp.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/src/uv-common.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/src/uv-common.h +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/src/uv-data-getter-setters.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/src/version.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/src/win/async.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/src/win/atomicops-inl.h +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/src/win/core.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/src/win/detect-wakeup.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/src/win/dl.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/src/win/error.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/src/win/fs-event.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/src/win/fs-fd-hash-inl.h +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/src/win/fs.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/src/win/getaddrinfo.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/src/win/getnameinfo.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/src/win/handle-inl.h +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/src/win/handle.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/src/win/internal.h +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/src/win/loop-watcher.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/src/win/pipe.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/src/win/poll.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/src/win/process-stdio.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/src/win/process.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/src/win/req-inl.h +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/src/win/signal.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/src/win/snprintf.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/src/win/stream-inl.h +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/src/win/stream.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/src/win/tcp.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/src/win/thread.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/src/win/tty.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/src/win/udp.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/src/win/util.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/src/win/winapi.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/src/win/winapi.h +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/src/win/winsock.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/src/win/winsock.h +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/benchmark-async-pummel.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/benchmark-async.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/benchmark-fs-stat.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/benchmark-getaddrinfo.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/benchmark-list.h +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/benchmark-loop-count.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/benchmark-million-async.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/benchmark-million-timers.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/benchmark-multi-accept.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/benchmark-ping-pongs.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/benchmark-ping-udp.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/benchmark-pound.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/benchmark-pump.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/benchmark-queue-work.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/benchmark-sizes.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/benchmark-spawn.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/benchmark-tcp-write-batch.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/benchmark-thread.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/benchmark-udp-pummel.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/blackhole-server.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/echo-server.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/fixtures/empty_file +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/fixtures/load_error.node +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/fixtures/lorem_ipsum.txt +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/fixtures/one_file/one_file +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/run-benchmarks.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/run-tests.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/runner-unix.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/runner-unix.h +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/runner-win.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/runner-win.h +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/runner.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/runner.h +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/task.h +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-active.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-async-null-cb.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-async.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-barrier.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-callback-stack.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-close-fd.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-close-order.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-condvar.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-connect-unspecified.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-connection-fail.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-cwd-and-chdir.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-default-loop-close.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-delayed-accept.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-dlerror.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-eintr-handling.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-embed.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-emfile.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-env-vars.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-error.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-fail-always.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-fork.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-fs-copyfile.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-fs-event.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-fs-fd-hash.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-fs-open-flags.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-fs-poll.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-fs-readdir.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-fs.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-get-currentexe.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-get-loadavg.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-get-memory.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-get-passwd.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-getaddrinfo.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-gethostname.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-getnameinfo.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-getsockname.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-getters-setters.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-gettimeofday.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-handle-fileno.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-homedir.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-hrtime.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-idle.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-idna.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-iouring-pollhup.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-ip-name.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-ip4-addr.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-ip6-addr.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-ipc-heavy-traffic-deadlock-bug.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-ipc-send-recv.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-ipc.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-list.h +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-loop-alive.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-loop-close.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-loop-configure.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-loop-handles.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-loop-oom.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-loop-stop.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-loop-time.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-metrics.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-multiple-listen.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-mutexes.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-not-readable-nor-writable-on-read-error.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-not-writable-after-shutdown.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-osx-select.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-pass-always.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-ping-pong.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-pipe-bind-error.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-pipe-close-stdout-read-stdin.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-pipe-connect-error.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-pipe-connect-multiple.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-pipe-connect-prepare.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-pipe-getsockname.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-pipe-pending-instances.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-pipe-sendmsg.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-pipe-server-close.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-pipe-set-fchmod.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-pipe-set-non-blocking.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-platform-output.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-poll-close-doesnt-corrupt-stack.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-poll-close.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-poll-closesocket.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-poll-multiple-handles.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-poll-oob.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-poll.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-process-priority.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-process-title-threadsafe.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-process-title.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-queue-foreach-delete.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-random.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-readable-on-eof.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-ref.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-run-nowait.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-run-once.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-semaphore.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-shutdown-close.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-shutdown-eof.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-shutdown-simultaneous.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-shutdown-twice.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-signal-multiple-loops.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-signal-pending-on-close.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-signal.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-socket-buffer-size.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-spawn.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-stdio-over-pipes.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-strscpy.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-strtok.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-tcp-alloc-cb-fail.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-tcp-bind-error.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-tcp-bind6-error.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-tcp-close-accept.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-tcp-close-after-read-timeout.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-tcp-close-reset.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-tcp-close-while-connecting.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-tcp-close.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-tcp-connect-error-after-write.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-tcp-connect-error.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-tcp-connect-timeout.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-tcp-connect6-error.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-tcp-create-socket-early.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-tcp-flags.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-tcp-oob.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-tcp-open.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-tcp-read-stop-start.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-tcp-read-stop.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-tcp-reuseport.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-tcp-rst.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-tcp-shutdown-after-write.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-tcp-try-write-error.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-tcp-try-write.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-tcp-unexpected-read.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-tcp-write-after-connect.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-tcp-write-fail.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-tcp-write-in-a-row.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-tcp-write-queue-order.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-tcp-write-to-half-open-connection.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-tcp-writealot.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-test-macros.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-thread-affinity.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-thread-equal.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-thread-name.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-thread-priority.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-thread.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-threadpool-cancel.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-threadpool.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-timer-again.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-timer-from-check.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-timer.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-tmpdir.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-tty-duplicate-key.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-tty-escape-sequence-processing.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-tty.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-udp-alloc-cb-fail.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-udp-bind.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-udp-connect.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-udp-connect6.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-udp-create-socket-early.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-udp-dgram-too-big.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-udp-ipv6.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-udp-mmsg.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-udp-multicast-interface.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-udp-multicast-interface6.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-udp-multicast-join.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-udp-multicast-join6.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-udp-multicast-ttl.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-udp-open.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-udp-options.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-udp-recv-in-a-row.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-udp-reuseport.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-udp-send-and-recv.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-udp-send-hang-loop.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-udp-send-immediate.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-udp-send-unreachable.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-udp-sendmmsg-error.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-udp-try-send.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-uname.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-walk-handles.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/test/test-watcher-cross-stop.c +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/tools/make_dist_html.py +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/tools/vswhere_usability_wrapper.cmd +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/tsansupp.txt +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/libuv/uv_win_longpath.manifest +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/vendor/update-libuv.sh +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/zig/addr.zig +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/zig/c.zig +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/zig/collections.zig +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/zig/datagram.zig +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/zig/dns.zig +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/zig/handle.zig +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/zig/loop.zig +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/zig/module.zig +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/zig/poller.zig +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/zig/process.zig +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/zig/py.zig +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/zig/timer.zig +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/zig/tshandle.zig +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/zig/uv.zig +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/zuvloop/__init__.py +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/zuvloop/_loop.py +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/zuvloop/_process.py +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/zuvloop/_runner.py +0 -0
- {zuvloop-0.0.2 → zuvloop-0.0.3}/zuvloop/_server.py +0 -0
- {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.
|
|
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.
|
|
126
|
-
|
|
127
|
-
|
|
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
|
|
148
|
-
|
|
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
|
-
|
|
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.
|
|
102
|
-
|
|
103
|
-
|
|
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
|
|
124
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
40
|
-
# provider is installed
|
|
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
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
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(
|
|
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
|
|
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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|