zuvloop 0.0.3__tar.gz → 0.0.4__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {zuvloop-0.0.3 → zuvloop-0.0.4}/PKG-INFO +4 -2
- {zuvloop-0.0.3 → zuvloop-0.0.4}/README.md +3 -1
- {zuvloop-0.0.3 → zuvloop-0.0.4}/pyproject.toml +1 -1
- zuvloop-0.0.4/vendor/README.md +17 -0
- zuvloop-0.0.4/vendor/libuv-maintainer-keys.txt +12 -0
- zuvloop-0.0.4/vendor/update-libuv.sh +38 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/zig/addr.zig +4 -3
- {zuvloop-0.0.3 → zuvloop-0.0.4}/zig/datagram.zig +8 -6
- {zuvloop-0.0.3 → zuvloop-0.0.4}/zig/dns.zig +5 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/zig/handle.zig +15 -4
- {zuvloop-0.0.3 → zuvloop-0.0.4}/zig/loop.zig +7 -3
- {zuvloop-0.0.3 → zuvloop-0.0.4}/zig/process.zig +4 -4
- {zuvloop-0.0.3 → zuvloop-0.0.4}/zig/transport.zig +34 -12
- {zuvloop-0.0.3 → zuvloop-0.0.4}/zuvloop/_base.py +98 -11
- {zuvloop-0.0.3 → zuvloop-0.0.4}/zuvloop/_connect.py +1 -1
- {zuvloop-0.0.3 → zuvloop-0.0.4}/zuvloop/_instrumentation.py +1 -1
- zuvloop-0.0.4/zuvloop/_loop.py +105 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/zuvloop/_process.py +117 -49
- zuvloop-0.0.3/vendor/README.md +0 -13
- zuvloop-0.0.3/vendor/update-libuv.sh +0 -21
- zuvloop-0.0.3/zuvloop/_loop.py +0 -64
- {zuvloop-0.0.3 → zuvloop-0.0.4}/.gitignore +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/LICENSE +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/build.zig +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/build.zig.zon +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/.gitattributes +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/.github/ISSUE_TEMPLATE.md +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/.github/dependabot.yml +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/.github/workflows/CI-docs.yml +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/.github/workflows/CI-sample.yml +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/.github/workflows/CI-unix.yml +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/.github/workflows/CI-win.yml +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/.github/workflows/sanitizer.yml +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/.gitignore +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/.mailmap +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/.readthedocs.yaml +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/AUTHORS +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/CMakeLists.txt +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/CONTRIBUTING.md +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/ChangeLog +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/LICENSE +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/LICENSE-docs +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/LICENSE-extra +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/LINKS.md +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/MAINTAINERS.md +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/Makefile.am +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/README.md +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/SECURITY.md +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/SUPPORTED_PLATFORMS.md +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/autogen.sh +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/cmake-toolchains/cross-mingw32.cmake +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/configure.ac +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/docs/code/.gitignore +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/docs/code/CMakeLists.txt +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/docs/code/cgi/main.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/docs/code/cgi/tick.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/docs/code/default-loop/main.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/docs/code/detach/main.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/docs/code/dns/main.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/docs/code/helloworld/main.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/docs/code/idle-basic/main.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/docs/code/idle-compute/main.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/docs/code/interfaces/main.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/docs/code/locks/main.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/docs/code/multi-echo-server/main.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/docs/code/multi-echo-server/worker.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/docs/code/onchange/main.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/docs/code/pipe-echo-server/main.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/docs/code/plugin/hello.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/docs/code/plugin/main.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/docs/code/plugin/plugin.h +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/docs/code/proc-streams/main.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/docs/code/proc-streams/test.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/docs/code/progress/main.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/docs/code/queue-cancel/main.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/docs/code/queue-work/main.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/docs/code/ref-timer/main.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/docs/code/signal/main.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/docs/code/spawn/main.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/docs/code/tcp-echo-server/main.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/docs/code/thread-create/main.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/docs/code/tty/main.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/docs/code/tty-gravity/main.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/docs/code/udp-dhcp/main.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/docs/code/uvcat/main.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/docs/code/uvstop/main.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/docs/code/uvtee/main.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/docs/code/uvwget/main.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/docs/make.bat +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/docs/requirements.txt +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/docs/src/api.rst +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/docs/src/async.rst +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/docs/src/check.rst +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/docs/src/conf.py +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/docs/src/design.rst +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/docs/src/dll.rst +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/docs/src/dns.rst +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/docs/src/errors.rst +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/docs/src/fs.rst +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/docs/src/fs_event.rst +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/docs/src/fs_poll.rst +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/docs/src/guide/about.rst +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/docs/src/guide/basics.rst +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/docs/src/guide/eventloops.rst +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/docs/src/guide/filesystem.rst +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/docs/src/guide/introduction.rst +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/docs/src/guide/networking.rst +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/docs/src/guide/processes.rst +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/docs/src/guide/threads.rst +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/docs/src/guide/utilities.rst +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/docs/src/guide.rst +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/docs/src/handle.rst +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/docs/src/idle.rst +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/docs/src/index.rst +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/docs/src/loop.rst +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/docs/src/metrics.rst +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/docs/src/migration_010_100.rst +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/docs/src/misc.rst +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/docs/src/pipe.rst +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/docs/src/poll.rst +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/docs/src/prepare.rst +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/docs/src/process.rst +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/docs/src/request.rst +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/docs/src/signal.rst +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/docs/src/sphinx-plugins/manpage.py +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/docs/src/static/architecture.png +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/docs/src/static/diagrams.key/Data/st0-311.jpg +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/docs/src/static/diagrams.key/Data/st1-475.jpg +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/docs/src/static/diagrams.key/Index.zip +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/docs/src/static/diagrams.key/Metadata/BuildVersionHistory.plist +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/docs/src/static/diagrams.key/Metadata/DocumentIdentifier +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/docs/src/static/diagrams.key/Metadata/Properties.plist +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/docs/src/static/diagrams.key/preview-micro.jpg +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/docs/src/static/diagrams.key/preview-web.jpg +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/docs/src/static/diagrams.key/preview.jpg +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/docs/src/static/favicon.ico +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/docs/src/static/logo.png +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/docs/src/static/loop_iteration.png +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/docs/src/stream.rst +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/docs/src/tcp.rst +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/docs/src/threading.rst +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/docs/src/threadpool.rst +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/docs/src/timer.rst +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/docs/src/tty.rst +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/docs/src/udp.rst +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/docs/src/upgrading.rst +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/docs/src/version.rst +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/img/banner.png +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/img/logos.svg +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/include/uv/aix.h +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/include/uv/bsd.h +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/include/uv/darwin.h +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/include/uv/errno.h +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/include/uv/linux.h +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/include/uv/os390.h +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/include/uv/posix.h +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/include/uv/sunos.h +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/include/uv/threadpool.h +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/include/uv/tree.h +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/include/uv/unix.h +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/include/uv/version.h +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/include/uv/win.h +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/include/uv.h +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/libuv-static.pc.in +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/libuv.pc.in +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/m4/.gitignore +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/m4/as_case.m4 +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/m4/ax_pthread.m4 +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/m4/libuv-check-flags.m4 +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/src/fs-poll.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/src/heap-inl.h +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/src/idna.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/src/idna.h +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/src/inet.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/src/queue.h +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/src/random.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/src/strscpy.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/src/strscpy.h +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/src/strtok.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/src/strtok.h +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/src/thread-common.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/src/threadpool.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/src/timer.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/src/unix/aix-common.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/src/unix/aix.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/src/unix/async.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/src/unix/bsd-ifaddrs.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/src/unix/bsd-proctitle.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/src/unix/core.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/src/unix/cygwin.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/src/unix/darwin-proctitle.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/src/unix/darwin-stub.h +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/src/unix/darwin-syscalls.h +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/src/unix/darwin.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/src/unix/dl.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/src/unix/freebsd.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/src/unix/fs.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/src/unix/fsevents.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/src/unix/getaddrinfo.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/src/unix/getnameinfo.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/src/unix/haiku.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/src/unix/hurd.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/src/unix/ibmi.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/src/unix/internal.h +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/src/unix/kqueue.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/src/unix/linux.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/src/unix/loop-watcher.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/src/unix/loop.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/src/unix/netbsd.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/src/unix/no-fsevents.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/src/unix/no-proctitle.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/src/unix/openbsd.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/src/unix/os390-proctitle.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/src/unix/os390-syscalls.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/src/unix/os390-syscalls.h +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/src/unix/os390.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/src/unix/pipe.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/src/unix/poll.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/src/unix/posix-hrtime.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/src/unix/posix-poll.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/src/unix/process.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/src/unix/procfs-exepath.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/src/unix/proctitle.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/src/unix/qnx.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/src/unix/random-devurandom.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/src/unix/random-getentropy.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/src/unix/random-getrandom.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/src/unix/random-sysctl-linux.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/src/unix/signal.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/src/unix/stream.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/src/unix/sunos.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/src/unix/sysinfo-loadavg.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/src/unix/sysinfo-memory.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/src/unix/tcp.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/src/unix/thread.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/src/unix/tty.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/src/unix/udp.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/src/uv-common.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/src/uv-common.h +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/src/uv-data-getter-setters.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/src/version.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/src/win/async.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/src/win/atomicops-inl.h +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/src/win/core.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/src/win/detect-wakeup.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/src/win/dl.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/src/win/error.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/src/win/fs-event.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/src/win/fs-fd-hash-inl.h +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/src/win/fs.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/src/win/getaddrinfo.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/src/win/getnameinfo.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/src/win/handle-inl.h +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/src/win/handle.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/src/win/internal.h +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/src/win/loop-watcher.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/src/win/pipe.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/src/win/poll.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/src/win/process-stdio.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/src/win/process.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/src/win/req-inl.h +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/src/win/signal.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/src/win/snprintf.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/src/win/stream-inl.h +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/src/win/stream.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/src/win/tcp.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/src/win/thread.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/src/win/tty.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/src/win/udp.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/src/win/util.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/src/win/winapi.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/src/win/winapi.h +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/src/win/winsock.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/src/win/winsock.h +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/test/benchmark-async-pummel.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/test/benchmark-async.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/test/benchmark-fs-stat.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/test/benchmark-getaddrinfo.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/test/benchmark-list.h +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/test/benchmark-loop-count.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/test/benchmark-million-async.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/test/benchmark-million-timers.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/test/benchmark-multi-accept.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/test/benchmark-ping-pongs.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/test/benchmark-ping-udp.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/test/benchmark-pound.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/test/benchmark-pump.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/test/benchmark-queue-work.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/test/benchmark-sizes.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/test/benchmark-spawn.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/test/benchmark-tcp-write-batch.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/test/benchmark-thread.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/test/benchmark-udp-pummel.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/test/blackhole-server.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/test/echo-server.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/test/fixtures/empty_file +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/test/fixtures/load_error.node +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/test/fixtures/lorem_ipsum.txt +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/test/fixtures/one_file/one_file +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/test/run-benchmarks.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/test/run-tests.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/test/runner-unix.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/test/runner-unix.h +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/test/runner-win.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/test/runner-win.h +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/test/runner.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/test/runner.h +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/test/task.h +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/test/test-active.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/test/test-async-null-cb.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/test/test-async.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/test/test-barrier.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/test/test-callback-stack.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/test/test-close-fd.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/test/test-close-order.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/test/test-condvar.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/test/test-connect-unspecified.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/test/test-connection-fail.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/test/test-cwd-and-chdir.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/test/test-default-loop-close.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/test/test-delayed-accept.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/test/test-dlerror.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/test/test-eintr-handling.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/test/test-embed.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/test/test-emfile.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/test/test-env-vars.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/test/test-error.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/test/test-fail-always.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/test/test-fork.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/test/test-fs-copyfile.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/test/test-fs-event.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/test/test-fs-fd-hash.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/test/test-fs-open-flags.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/test/test-fs-poll.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/test/test-fs-readdir.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/test/test-fs.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/test/test-get-currentexe.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/test/test-get-loadavg.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/test/test-get-memory.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/test/test-get-passwd.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/test/test-getaddrinfo.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/test/test-gethostname.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/test/test-getnameinfo.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/test/test-getsockname.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/test/test-getters-setters.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/test/test-gettimeofday.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/test/test-handle-fileno.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/test/test-homedir.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/test/test-hrtime.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/test/test-idle.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/test/test-idna.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/test/test-iouring-pollhup.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/test/test-ip-name.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/test/test-ip4-addr.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/test/test-ip6-addr.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/test/test-ipc-heavy-traffic-deadlock-bug.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/test/test-ipc-send-recv.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/test/test-ipc.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/test/test-list.h +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/test/test-loop-alive.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/test/test-loop-close.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/test/test-loop-configure.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/test/test-loop-handles.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/test/test-loop-oom.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/test/test-loop-stop.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/test/test-loop-time.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/test/test-metrics.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/test/test-multiple-listen.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/test/test-mutexes.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/test/test-not-readable-nor-writable-on-read-error.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/test/test-not-writable-after-shutdown.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/test/test-osx-select.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/test/test-pass-always.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/test/test-ping-pong.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/test/test-pipe-bind-error.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/test/test-pipe-close-stdout-read-stdin.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/test/test-pipe-connect-error.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/test/test-pipe-connect-multiple.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/test/test-pipe-connect-prepare.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/test/test-pipe-getsockname.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/test/test-pipe-pending-instances.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/test/test-pipe-sendmsg.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/test/test-pipe-server-close.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/test/test-pipe-set-fchmod.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/test/test-pipe-set-non-blocking.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/test/test-platform-output.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/test/test-poll-close-doesnt-corrupt-stack.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/test/test-poll-close.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/test/test-poll-closesocket.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/test/test-poll-multiple-handles.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/test/test-poll-oob.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/test/test-poll.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/test/test-process-priority.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/test/test-process-title-threadsafe.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/test/test-process-title.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/test/test-queue-foreach-delete.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/test/test-random.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/test/test-readable-on-eof.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/test/test-ref.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/test/test-run-nowait.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/test/test-run-once.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/test/test-semaphore.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/test/test-shutdown-close.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/test/test-shutdown-eof.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/test/test-shutdown-simultaneous.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/test/test-shutdown-twice.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/test/test-signal-multiple-loops.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/test/test-signal-pending-on-close.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/test/test-signal.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/test/test-socket-buffer-size.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/test/test-spawn.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/test/test-stdio-over-pipes.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/test/test-strscpy.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/test/test-strtok.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/test/test-tcp-alloc-cb-fail.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/test/test-tcp-bind-error.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/test/test-tcp-bind6-error.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/test/test-tcp-close-accept.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/test/test-tcp-close-after-read-timeout.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/test/test-tcp-close-reset.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/test/test-tcp-close-while-connecting.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/test/test-tcp-close.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/test/test-tcp-connect-error-after-write.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/test/test-tcp-connect-error.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/test/test-tcp-connect-timeout.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/test/test-tcp-connect6-error.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/test/test-tcp-create-socket-early.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/test/test-tcp-flags.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/test/test-tcp-oob.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/test/test-tcp-open.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/test/test-tcp-read-stop-start.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/test/test-tcp-read-stop.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/test/test-tcp-reuseport.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/test/test-tcp-rst.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/test/test-tcp-shutdown-after-write.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/test/test-tcp-try-write-error.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/test/test-tcp-try-write.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/test/test-tcp-unexpected-read.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/test/test-tcp-write-after-connect.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/test/test-tcp-write-fail.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/test/test-tcp-write-in-a-row.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/test/test-tcp-write-queue-order.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/test/test-tcp-write-to-half-open-connection.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/test/test-tcp-writealot.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/test/test-test-macros.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/test/test-thread-affinity.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/test/test-thread-equal.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/test/test-thread-name.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/test/test-thread-priority.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/test/test-thread.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/test/test-threadpool-cancel.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/test/test-threadpool.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/test/test-timer-again.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/test/test-timer-from-check.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/test/test-timer.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/test/test-tmpdir.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/test/test-tty-duplicate-key.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/test/test-tty-escape-sequence-processing.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/test/test-tty.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/test/test-udp-alloc-cb-fail.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/test/test-udp-bind.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/test/test-udp-connect.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/test/test-udp-connect6.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/test/test-udp-create-socket-early.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/test/test-udp-dgram-too-big.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/test/test-udp-ipv6.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/test/test-udp-mmsg.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/test/test-udp-multicast-interface.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/test/test-udp-multicast-interface6.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/test/test-udp-multicast-join.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/test/test-udp-multicast-join6.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/test/test-udp-multicast-ttl.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/test/test-udp-open.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/test/test-udp-options.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/test/test-udp-recv-in-a-row.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/test/test-udp-reuseport.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/test/test-udp-send-and-recv.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/test/test-udp-send-hang-loop.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/test/test-udp-send-immediate.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/test/test-udp-send-unreachable.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/test/test-udp-sendmmsg-error.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/test/test-udp-try-send.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/test/test-uname.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/test/test-walk-handles.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/test/test-watcher-cross-stop.c +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/tools/make_dist_html.py +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/tools/vswhere_usability_wrapper.cmd +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/tsansupp.txt +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/vendor/libuv/uv_win_longpath.manifest +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/zig/c.zig +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/zig/collections.zig +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/zig/module.zig +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/zig/poller.zig +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/zig/py.zig +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/zig/timer.zig +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/zig/tshandle.zig +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/zig/uv.zig +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/zuvloop/__init__.py +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/zuvloop/_runner.py +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/zuvloop/_sendfile.py +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/zuvloop/_server.py +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/zuvloop/_sockets.py +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/zuvloop/_zuvloop.pyi +0 -0
- {zuvloop-0.0.3 → zuvloop-0.0.4}/zuvloop/py.typed +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: zuvloop
|
|
3
|
-
Version: 0.0.
|
|
3
|
+
Version: 0.0.4
|
|
4
4
|
Summary: A libuv event loop for asyncio, written in Zig.
|
|
5
5
|
Project-URL: Source, https://github.com/Kludex/zuvloop
|
|
6
6
|
Author-email: Marcelo Trylesinski <marcelotryle@gmail.com>
|
|
@@ -211,6 +211,8 @@ $ uv pip install -e . --group dev
|
|
|
211
211
|
$ uv run pytest
|
|
212
212
|
$ uv run mypy
|
|
213
213
|
$ uv run ruff check
|
|
214
|
+
$ uv run ruff format --check
|
|
215
|
+
$ ./scripts/check-zig # requires ZLint 0.9.1 on PATH
|
|
214
216
|
$ uv run --group bench python benchmarks/run.py
|
|
215
217
|
```
|
|
216
218
|
|
|
@@ -221,7 +223,7 @@ $ python scripts/build.py
|
|
|
221
223
|
```
|
|
222
224
|
|
|
223
225
|
`vendor/libuv` is an unmodified upstream release tarball; see `vendor/README.md`. Update it with
|
|
224
|
-
`./vendor/update-libuv.sh <version>`.
|
|
226
|
+
`./vendor/update-libuv.sh <version> <sha256>`.
|
|
225
227
|
|
|
226
228
|
## License
|
|
227
229
|
|
|
@@ -187,6 +187,8 @@ $ uv pip install -e . --group dev
|
|
|
187
187
|
$ uv run pytest
|
|
188
188
|
$ uv run mypy
|
|
189
189
|
$ uv run ruff check
|
|
190
|
+
$ uv run ruff format --check
|
|
191
|
+
$ ./scripts/check-zig # requires ZLint 0.9.1 on PATH
|
|
190
192
|
$ uv run --group bench python benchmarks/run.py
|
|
191
193
|
```
|
|
192
194
|
|
|
@@ -197,7 +199,7 @@ $ python scripts/build.py
|
|
|
197
199
|
```
|
|
198
200
|
|
|
199
201
|
`vendor/libuv` is an unmodified upstream release tarball; see `vendor/README.md`. Update it with
|
|
200
|
-
`./vendor/update-libuv.sh <version>`.
|
|
202
|
+
`./vendor/update-libuv.sh <version> <sha256>`.
|
|
201
203
|
|
|
202
204
|
## License
|
|
203
205
|
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
# invokes the native compiler, so a future version resolved from a lower bound
|
|
4
4
|
# could execute unreviewed code into the wheels the publish job trusts. The
|
|
5
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"]
|
|
6
|
+
requires = ["hatchling", "hatch-vcs==0.5.0", "hatch-ziglang==0.2.1", "ziglang==0.16.0"]
|
|
7
7
|
build-backend = "hatchling.build"
|
|
8
8
|
|
|
9
9
|
[project]
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
# Vendored dependencies
|
|
2
|
+
|
|
3
|
+
## libuv
|
|
4
|
+
|
|
5
|
+
- Version: **1.51.0**
|
|
6
|
+
- Source: <https://dist.libuv.org/dist/v1.51.0/libuv-v1.51.0.tar.gz>
|
|
7
|
+
- SHA-256: `5f0557b90b1106de71951a3c3931de5e0430d78da1d9a10287ebc7a3f78ef8eb`
|
|
8
|
+
|
|
9
|
+
The tree under `libuv/` is the upstream release tarball, extracted verbatim. **Never edit it.**
|
|
10
|
+
Everything zuvloop adds lives in `zig/`, and `build.zig` compiles the vendored sources with the same
|
|
11
|
+
defines and file lists as upstream's `CMakeLists.txt`.
|
|
12
|
+
|
|
13
|
+
A weekly workflow checks for a new signed release, verifies its signer against
|
|
14
|
+
`libuv-maintainer-keys.txt`, tests every supported target, and opens an update pull request. For a
|
|
15
|
+
manual update, verify the checksum through an independent channel, then run
|
|
16
|
+
`./vendor/update-libuv.sh <version> <sha256>` and re-check the file lists at the top of `build.zig`
|
|
17
|
+
against the new `CMakeLists.txt`.
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
# Full fingerprint and libuv git tag containing the public key.
|
|
2
|
+
# Keep this trust root in sync with https://github.com/libuv/libuv/blob/v1.x/MAINTAINERS.md.
|
|
3
|
+
D77B1E34243FBAF05F8E9CC34F55C8C846AB89B9 pubkey-bnoordhuis
|
|
4
|
+
94AE36675C464D64BAFA68DD7434390BDBE9B9C5 pubkey-cjihrig
|
|
5
|
+
57353E0DBDAAA7E839B66A1AFF47D5E4AD8B4FDC pubkey-cjihrig-kb
|
|
6
|
+
AEAD0A4B686767751A0E4AEF34A25FB128246514 pubkey-vtjnash
|
|
7
|
+
CFBB9CA9A5BEAFD70E2B3C5A79A67C55A3679C8B pubkey2022-vtjnash
|
|
8
|
+
5804F9998A922AFBA39847A0718350906134887F github:erw7
|
|
9
|
+
C82FA3AE1CBEDC6BE46B9360C43CEC45C17AB93C pubkey-richardlau
|
|
10
|
+
612F0EAD9401622379DF4402F28C3C8DA33C03BE pubkey-santigimeno
|
|
11
|
+
FDF519364458319FA8233DC9410E5553AE9BC059 pubkey-saghul
|
|
12
|
+
AEFC279A0C9306767E5829A1251CA676820DC7F3 pubkey-trevnorris
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# Replace vendor/libuv with a pristine upstream release tarball.
|
|
3
|
+
set -euo pipefail
|
|
4
|
+
|
|
5
|
+
version="${1:?usage: update-libuv.sh <version> <sha256>, e.g. 1.51.0 5f0557...}"
|
|
6
|
+
checksum="${2:?supply the SHA-256 published for libuv ${version}}"
|
|
7
|
+
if [[ ! "$version" =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
|
|
8
|
+
echo "invalid libuv version: $version" >&2
|
|
9
|
+
exit 2
|
|
10
|
+
fi
|
|
11
|
+
if [[ ! "$checksum" =~ ^[[:xdigit:]]{64}$ ]]; then
|
|
12
|
+
echo "invalid SHA-256: $checksum" >&2
|
|
13
|
+
exit 2
|
|
14
|
+
fi
|
|
15
|
+
here="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
16
|
+
url="https://dist.libuv.org/dist/v${version}/libuv-v${version}.tar.gz"
|
|
17
|
+
|
|
18
|
+
tmp="$(mktemp -d)"
|
|
19
|
+
trap 'rm -rf "$tmp"' EXIT
|
|
20
|
+
|
|
21
|
+
curl -fsSL "$url" -o "$tmp/libuv.tar.gz"
|
|
22
|
+
printf '%s %s\n' "$checksum" "$tmp/libuv.tar.gz" | shasum -a 256 -c -
|
|
23
|
+
tar xzf "$tmp/libuv.tar.gz" -C "$tmp"
|
|
24
|
+
rm -rf "$here/libuv"
|
|
25
|
+
mv "$tmp/libuv-v${version}" "$here/libuv"
|
|
26
|
+
|
|
27
|
+
sed -i.bak -E "s/\*\*[0-9]+\.[0-9]+\.[0-9]+\*\*/**${version}**/; s|dist/v[0-9]+\.[0-9]+\.[0-9]+/libuv-v[0-9]+\.[0-9]+\.[0-9]+|dist/v${version}/libuv-v${version}|g; s|SHA-256: \`[[:xdigit:]]{64}\`|SHA-256: \`${checksum}\`|" "$here/README.md"
|
|
28
|
+
if ! grep -Fq -- "- Version: **${version}**" "$here/README.md" ||
|
|
29
|
+
! grep -Fq -- "dist/v${version}/libuv-v${version}.tar.gz" "$here/README.md" ||
|
|
30
|
+
! grep -Fq -- "SHA-256: \`${checksum}\`" "$here/README.md"; then
|
|
31
|
+
mv "$here/README.md.bak" "$here/README.md"
|
|
32
|
+
echo "failed to update vendor/README.md; check its format" >&2
|
|
33
|
+
exit 1
|
|
34
|
+
fi
|
|
35
|
+
rm -f "$here/README.md.bak"
|
|
36
|
+
|
|
37
|
+
echo "vendored libuv ${version} from ${url}"
|
|
38
|
+
echo "now diff vendor/libuv/CMakeLists.txt against the source lists in build.zig"
|
|
@@ -35,6 +35,7 @@ fn tupleItem(t: *py.Object, i: c.Py_ssize_t) py.Error!*py.Object {
|
|
|
35
35
|
pub fn fromPython(family: c_int, address: *py.Object, out: *Storage) py.Error!c_int {
|
|
36
36
|
out.* = .{};
|
|
37
37
|
if (family == AF_UNIX) {
|
|
38
|
+
// SAFETY: each accepted address type assigns path, and every other type returns.
|
|
38
39
|
var path: [*c]const u8 = undefined;
|
|
39
40
|
var len: c.Py_ssize_t = 0;
|
|
40
41
|
if (c.PyUnicode_Check(address) != 0) {
|
|
@@ -146,9 +147,9 @@ pub fn same(a: *const posix.sockaddr, a_len: c_int, b: *const posix.sockaddr, b_
|
|
|
146
147
|
const x: *const posix.sockaddr.in6 = @ptrCast(@alignCast(a));
|
|
147
148
|
const y: *const posix.sockaddr.in6 = @ptrCast(@alignCast(b));
|
|
148
149
|
if (x.port != y.port or !std.mem.eql(u8, &x.addr, &y.addr)) return false;
|
|
149
|
-
// asyncio compares tuples, so
|
|
150
|
-
// treating
|
|
151
|
-
return x.scope_id == y.scope_id;
|
|
150
|
+
// asyncio compares the complete tuples, so both ancillary fields must
|
|
151
|
+
// be stated exactly rather than treating zero as a wildcard.
|
|
152
|
+
return x.flowinfo == y.flowinfo and x.scope_id == y.scope_id;
|
|
152
153
|
}
|
|
153
154
|
return false;
|
|
154
155
|
}
|
|
@@ -392,6 +392,7 @@ fn sendto(self_obj: *py.Object, args: []const ?*py.Object, nargs: usize, kwnames
|
|
|
392
392
|
return py.errValue("sendto() requires an address on an unconnected transport");
|
|
393
393
|
}
|
|
394
394
|
|
|
395
|
+
// SAFETY: PyObject_GetBuffer initializes view or returns an error.
|
|
395
396
|
var view: c.Py_buffer = undefined;
|
|
396
397
|
if (c.PyObject_GetBuffer(args[0].?, &view, c.PyBUF_SIMPLE) < 0) return py.Error.Python;
|
|
397
398
|
defer c.PyBuffer_Release(&view);
|
|
@@ -596,12 +597,13 @@ pub fn makeDatagram(self_obj: *py.Object, args: []const ?*py.Object) py.Error!*p
|
|
|
596
597
|
self.flags |= OPEN;
|
|
597
598
|
uv.setData(self.udp(), self);
|
|
598
599
|
|
|
599
|
-
|
|
600
|
+
const status = uv.uv_udp_open(self.udp(), fd);
|
|
601
|
+
if (status < 0) {
|
|
600
602
|
// libuv never took the descriptor, so the caller still owns it.
|
|
601
603
|
self.flags &= ~OPEN;
|
|
602
604
|
py.incref(obj);
|
|
603
605
|
uv.uv_close(uv.asHandle(self.udp()), onOpenFailed);
|
|
604
|
-
return py.errUv(
|
|
606
|
+
return py.errUv(status);
|
|
605
607
|
}
|
|
606
608
|
|
|
607
609
|
py.incref(obj);
|
|
@@ -704,11 +706,11 @@ var methods = [_]c.PyMethodDef{
|
|
|
704
706
|
};
|
|
705
707
|
|
|
706
708
|
var slots = [_]c.PyType_Slot{
|
|
707
|
-
.{ .slot = c.Py_tp_dealloc, .pfunc = @
|
|
708
|
-
.{ .slot = c.Py_tp_traverse, .pfunc = @
|
|
709
|
-
.{ .slot = c.Py_tp_clear, .pfunc = @
|
|
709
|
+
.{ .slot = c.Py_tp_dealloc, .pfunc = @ptrCast(@constCast(&dealloc)) },
|
|
710
|
+
.{ .slot = c.Py_tp_traverse, .pfunc = @ptrCast(@constCast(&traverse)) },
|
|
711
|
+
.{ .slot = c.Py_tp_clear, .pfunc = @ptrCast(@constCast(&clear_)) },
|
|
710
712
|
.{ .slot = c.Py_tp_methods, .pfunc = @ptrCast(&methods) },
|
|
711
|
-
.{ .slot = c.Py_tp_doc, .pfunc = @
|
|
713
|
+
.{ .slot = c.Py_tp_doc, .pfunc = @ptrCast(@constCast("A libuv-backed datagram transport.")) },
|
|
712
714
|
.{ .slot = 0, .pfunc = null },
|
|
713
715
|
};
|
|
714
716
|
|
|
@@ -36,7 +36,9 @@ const Request = struct {
|
|
|
36
36
|
prev: ?*Request = null,
|
|
37
37
|
next: ?*Request = null,
|
|
38
38
|
hints: std.c.addrinfo = std.mem.zeroes(std.c.addrinfo),
|
|
39
|
+
// SAFETY: request construction fills this array before libuv receives it.
|
|
39
40
|
host: [max_host]u8 = undefined,
|
|
41
|
+
// SAFETY: request construction fills this array before libuv receives it.
|
|
40
42
|
service: [32]u8 = undefined,
|
|
41
43
|
|
|
42
44
|
inline fn addrReq(self: *Request) *uv.GetAddrInfo {
|
|
@@ -117,6 +119,7 @@ pub fn traverse(st: *loopmod.State, visitproc: c.visitproc, arg: ?*anyopaque) c_
|
|
|
117
119
|
fn copyZ(dst: []u8, value: *py.Object, what: [:0]const u8) py.Error!?[*:0]const u8 {
|
|
118
120
|
if (py.isNone(value)) return null;
|
|
119
121
|
var len: c.Py_ssize_t = 0;
|
|
122
|
+
// SAFETY: each accepted Python type assigns src, and every other type returns.
|
|
120
123
|
var src: [*c]const u8 = undefined;
|
|
121
124
|
if (c.PyUnicode_Check(value) != 0) {
|
|
122
125
|
src = c.PyUnicode_AsUTF8AndSize(value, &len) orelse return py.Error.Python;
|
|
@@ -368,6 +371,8 @@ fn resolveLiteral(hints: *const std.c.addrinfo, host: ?[*:0]const u8, service: ?
|
|
|
368
371
|
port = std.fmt.parseInt(u16, text, 10) catch return null;
|
|
369
372
|
}
|
|
370
373
|
|
|
374
|
+
// SAFETY: inet_pton initializes the address and the successful branch fills
|
|
375
|
+
// the remaining sockaddr fields before storage is read.
|
|
371
376
|
var storage: addr.Storage = undefined;
|
|
372
377
|
const family = hints.family;
|
|
373
378
|
if (family == std.c.AF.INET or family == std.c.AF.UNSPEC) {
|
|
@@ -17,6 +17,7 @@ const inline_args = 3;
|
|
|
17
17
|
const arg_alloc = std.heap.c_allocator;
|
|
18
18
|
|
|
19
19
|
pub const CANCELLED: u32 = 1 << 0;
|
|
20
|
+
const RUNNING: u32 = 1 << 1;
|
|
20
21
|
|
|
21
22
|
pub const Handle = extern struct {
|
|
22
23
|
ob_base: c.PyObject,
|
|
@@ -86,6 +87,14 @@ pub fn create(
|
|
|
86
87
|
pub fn run(self: *Handle) void {
|
|
87
88
|
if (self.isCancelled()) return;
|
|
88
89
|
const callback = self.callback orelse return;
|
|
90
|
+
self.flags |= RUNNING;
|
|
91
|
+
defer {
|
|
92
|
+
self.flags &= ~RUNNING;
|
|
93
|
+
if (self.isCancelled()) {
|
|
94
|
+
clearArgs(self);
|
|
95
|
+
py.clear(&self.callback);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
89
98
|
invoke(@ptrCast(self), self.loop, callback, self.argv(), self.nargs, self.context.?);
|
|
90
99
|
}
|
|
91
100
|
|
|
@@ -168,8 +177,12 @@ fn cancel(self_obj: *py.Object) py.Error!*py.Object {
|
|
|
168
177
|
const self: *Handle = @ptrCast(@alignCast(self_obj));
|
|
169
178
|
if (!self.isCancelled()) {
|
|
170
179
|
self.flags |= CANCELLED;
|
|
171
|
-
|
|
172
|
-
|
|
180
|
+
// Vectorcall borrows these references. A callback may cancel its own
|
|
181
|
+
// handle, so release them when run() regains control instead.
|
|
182
|
+
if (self.flags & RUNNING == 0) {
|
|
183
|
+
clearArgs(self);
|
|
184
|
+
py.clear(&self.callback);
|
|
185
|
+
}
|
|
173
186
|
}
|
|
174
187
|
return py.noneRef();
|
|
175
188
|
}
|
|
@@ -179,7 +192,6 @@ fn cancelled(self_obj: *py.Object) py.Error!*py.Object {
|
|
|
179
192
|
return py.boolRef(self.isCancelled());
|
|
180
193
|
}
|
|
181
194
|
|
|
182
|
-
|
|
183
195
|
fn getCallback(self_obj: ?*py.Object, _: ?*anyopaque) callconv(.c) ?*py.Object {
|
|
184
196
|
const self: *Handle = @ptrCast(@alignCast(self_obj.?));
|
|
185
197
|
return py.newref(self.callback orelse py.none());
|
|
@@ -243,7 +255,6 @@ var handle_spec = c.PyType_Spec{
|
|
|
243
255
|
.slots = &handle_slots,
|
|
244
256
|
};
|
|
245
257
|
|
|
246
|
-
|
|
247
258
|
pub fn register(module: *py.Object) py.Error!void {
|
|
248
259
|
handle_type = @ptrCast(c.PyType_FromModuleAndSpec(module, &handle_spec, null) orelse return py.Error.Python);
|
|
249
260
|
if (c.PyModule_AddObjectRef(module, "Handle", @ptrCast(handle_type)) < 0) return py.Error.Python;
|
|
@@ -904,7 +904,7 @@ fn dealloc(obj: ?*py.Object) callconv(.c) void {
|
|
|
904
904
|
if (needs_close) {
|
|
905
905
|
st.ready.deinit();
|
|
906
906
|
st.timers.deinit();
|
|
907
|
-
|
|
907
|
+
}
|
|
908
908
|
// The flush list owns one Python reference per transport regardless of
|
|
909
909
|
// how the loop reached deallocation, including partially completed
|
|
910
910
|
// explicit close paths.
|
|
@@ -951,8 +951,12 @@ fn traverse(obj: ?*py.Object, visitproc: c.visitproc, arg: ?*anyopaque) callconv
|
|
|
951
951
|
if (r != 0) return r;
|
|
952
952
|
transport = owned.owner_next;
|
|
953
953
|
}
|
|
954
|
-
|
|
955
|
-
|
|
954
|
+
// Once close hands resolver requests to the native reaper, their
|
|
955
|
+
// futures are gone and the request list mutates without the GIL.
|
|
956
|
+
if (!isReaping(st)) {
|
|
957
|
+
r = dns.traverse(st, visitproc, arg);
|
|
958
|
+
if (r != 0) return r;
|
|
959
|
+
}
|
|
956
960
|
r = pollermod.traverse(st, visitproc, arg);
|
|
957
961
|
if (r != 0) return r;
|
|
958
962
|
}
|
|
@@ -347,11 +347,11 @@ var methods = [_]c.PyMethodDef{
|
|
|
347
347
|
};
|
|
348
348
|
|
|
349
349
|
var slots = [_]c.PyType_Slot{
|
|
350
|
-
.{ .slot = c.Py_tp_dealloc, .pfunc = @
|
|
351
|
-
.{ .slot = c.Py_tp_traverse, .pfunc = @
|
|
352
|
-
.{ .slot = c.Py_tp_clear, .pfunc = @
|
|
350
|
+
.{ .slot = c.Py_tp_dealloc, .pfunc = @ptrCast(@constCast(&dealloc)) },
|
|
351
|
+
.{ .slot = c.Py_tp_traverse, .pfunc = @ptrCast(@constCast(&traverse)) },
|
|
352
|
+
.{ .slot = c.Py_tp_clear, .pfunc = @ptrCast(@constCast(&clear_)) },
|
|
353
353
|
.{ .slot = c.Py_tp_methods, .pfunc = @ptrCast(&methods) },
|
|
354
|
-
.{ .slot = c.Py_tp_doc, .pfunc = @
|
|
354
|
+
.{ .slot = c.Py_tp_doc, .pfunc = @ptrCast(@constCast("A libuv-backed child process.")) },
|
|
355
355
|
.{ .slot = 0, .pfunc = null },
|
|
356
356
|
};
|
|
357
357
|
|
|
@@ -136,12 +136,12 @@ pub const Transport = extern struct {
|
|
|
136
136
|
|
|
137
137
|
var handle_offset: usize = 0;
|
|
138
138
|
|
|
139
|
-
/// A queued write: the libuv request,
|
|
140
|
-
///
|
|
139
|
+
/// A queued write: the libuv request, immutable buffer views, and the vector
|
|
140
|
+
/// libuv reads from - all in one allocation.
|
|
141
141
|
///
|
|
142
|
-
///
|
|
143
|
-
///
|
|
144
|
-
/// until libuv reports
|
|
142
|
+
/// An exact `bytes` object is retained without copying. Every other exporter is
|
|
143
|
+
/// snapshotted first, so its view owns immutable bytes rather than caller memory;
|
|
144
|
+
/// either way the backing object stays alive until libuv reports completion.
|
|
145
145
|
///
|
|
146
146
|
/// The request does not take another Python reference to `transport`. The
|
|
147
147
|
/// loop-owned handle reference remains alive until `onClosed`, and libuv runs
|
|
@@ -178,6 +178,23 @@ fn releaseViews(views: []c.Py_buffer) void {
|
|
|
178
178
|
for (views) |*view| c.PyBuffer_Release(view);
|
|
179
179
|
}
|
|
180
180
|
|
|
181
|
+
/// Hold immutable bytes directly; snapshot every other exporter before write()
|
|
182
|
+
/// returns so queued I/O cannot observe later mutations by the caller.
|
|
183
|
+
fn acquireWriteView(data: *py.Object, view: *c.Py_buffer) py.Error!void {
|
|
184
|
+
if (c.PyBytes_CheckExact(data) != 0) {
|
|
185
|
+
if (c.PyObject_GetBuffer(data, view, c.PyBUF_SIMPLE) < 0) return py.Error.Python;
|
|
186
|
+
return;
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
// SAFETY: PyObject_GetBuffer initializes source or returns an error.
|
|
190
|
+
var source: c.Py_buffer = undefined;
|
|
191
|
+
if (c.PyObject_GetBuffer(data, &source, c.PyBUF_SIMPLE) < 0) return py.Error.Python;
|
|
192
|
+
defer c.PyBuffer_Release(&source);
|
|
193
|
+
const snapshot = c.PyBytes_FromStringAndSize(@ptrCast(source.buf), source.len) orelse return py.Error.Python;
|
|
194
|
+
defer py.decref(snapshot);
|
|
195
|
+
if (c.PyObject_GetBuffer(snapshot, view, c.PyBUF_SIMPLE) < 0) return py.Error.Python;
|
|
196
|
+
}
|
|
197
|
+
|
|
181
198
|
// ---------------------------------------------------------------------------
|
|
182
199
|
// protocol dispatch
|
|
183
200
|
|
|
@@ -550,9 +567,13 @@ fn queueWrite(self: *Transport, bufs: []const uv.Buf, views: []c.Py_buffer) py.E
|
|
|
550
567
|
/// Whether a write may proceed, releasing `views` if it may not.
|
|
551
568
|
///
|
|
552
569
|
/// A close only drops the data; raising would turn an ordinary shutdown race
|
|
553
|
-
/// into an exception. `write_eof()` is the caller's mistake and
|
|
554
|
-
///
|
|
570
|
+
/// into an exception. `write_eof()` is the caller's mistake, and must be checked
|
|
571
|
+
/// here too because acquiring an iterable or buffer can reenter the transport.
|
|
555
572
|
fn acceptsWrite(self: *Transport, views: []c.Py_buffer) py.Error!bool {
|
|
573
|
+
if (self.flags & EOF_WRITTEN != 0) {
|
|
574
|
+
releaseViews(views);
|
|
575
|
+
return py.errRuntime("Cannot write after write_eof()");
|
|
576
|
+
}
|
|
556
577
|
if (self.flags & (CONN_LOST | CLOSING) != 0) {
|
|
557
578
|
releaseViews(views);
|
|
558
579
|
return false;
|
|
@@ -875,8 +896,9 @@ pub fn startReadingMethod(self_obj: *py.Object) py.Error!*py.Object {
|
|
|
875
896
|
|
|
876
897
|
fn write(self_obj: *py.Object, data: *py.Object) py.Error!*py.Object {
|
|
877
898
|
const self = asTransport(self_obj);
|
|
899
|
+
// SAFETY: acquireWriteView initializes the only element or returns an error.
|
|
878
900
|
var views = [_]c.Py_buffer{undefined};
|
|
879
|
-
|
|
901
|
+
try acquireWriteView(data, &views[0]);
|
|
880
902
|
if (self.flags & EOF_WRITTEN != 0) {
|
|
881
903
|
c.PyBuffer_Release(&views[0]);
|
|
882
904
|
return py.errRuntime("Cannot call write() after write_eof()");
|
|
@@ -912,12 +934,12 @@ fn writelines(self_obj: *py.Object, data: *py.Object) py.Error!*py.Object {
|
|
|
912
934
|
return py.Error.Python;
|
|
913
935
|
};
|
|
914
936
|
// The buffer view keeps the exporter alive, so the item reference can go.
|
|
915
|
-
|
|
916
|
-
|
|
917
|
-
if (acquired < 0) {
|
|
937
|
+
acquireWriteView(item, &views[filled]) catch {
|
|
938
|
+
py.decref(item);
|
|
918
939
|
releaseViews(views[0..filled]);
|
|
919
940
|
return py.Error.Python;
|
|
920
|
-
}
|
|
941
|
+
};
|
|
942
|
+
py.decref(item);
|
|
921
943
|
bufs[filled] = .{ .base = @ptrCast(views[filled].buf), .len = @intCast(views[filled].len) };
|
|
922
944
|
}
|
|
923
945
|
try submitWrite(self, bufs, views);
|
|
@@ -12,6 +12,7 @@ import weakref
|
|
|
12
12
|
from asyncio import events as _events
|
|
13
13
|
from collections.abc import Callable, Coroutine
|
|
14
14
|
from contextvars import Context
|
|
15
|
+
from dataclasses import dataclass
|
|
15
16
|
from functools import partial
|
|
16
17
|
from typing import Any
|
|
17
18
|
|
|
@@ -26,6 +27,27 @@ from ._instrumentation import (
|
|
|
26
27
|
_ExceptionHandler = Callable[[asyncio.AbstractEventLoop, dict[str, Any]], object]
|
|
27
28
|
|
|
28
29
|
|
|
30
|
+
# Signal dispositions and the wakeup fd are process-global. Tokens let delayed
|
|
31
|
+
# finalization tell whether another loop has replaced the state it installed.
|
|
32
|
+
@dataclass(eq=False, slots=True)
|
|
33
|
+
class SignalOwner:
|
|
34
|
+
finalized: bool = False
|
|
35
|
+
|
|
36
|
+
def is_finalized(self) -> bool:
|
|
37
|
+
return self.finalized
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
@dataclass(frozen=True, slots=True)
|
|
41
|
+
class WakeupState:
|
|
42
|
+
fd: int
|
|
43
|
+
owner: SignalOwner | None
|
|
44
|
+
was_attached: bool
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
_signal_owners: dict[int, SignalOwner] = {}
|
|
48
|
+
_wakeup_fd_owner: SignalOwner | None = None
|
|
49
|
+
|
|
50
|
+
|
|
29
51
|
# The native methods are stricter than typeshed's AbstractEventLoop, which
|
|
30
52
|
# types several of them with TypeVarTuples this class cannot reproduce.
|
|
31
53
|
class LoopBase(_zuvloop.Loop, asyncio.AbstractEventLoop): # type: ignore[misc]
|
|
@@ -53,6 +75,7 @@ class LoopBase(_zuvloop.Loop, asyncio.AbstractEventLoop): # type: ignore[misc]
|
|
|
53
75
|
# Which `sock_*` call owns the watcher currently on each (fd, write).
|
|
54
76
|
self._sock_watchers: dict[tuple[int, bool], object] = {}
|
|
55
77
|
self._wakeup_fd_attached = False
|
|
78
|
+
self._signal_owner = SignalOwner()
|
|
56
79
|
self._instrumentation = Instrumentation()
|
|
57
80
|
self._monitoring_armed = False
|
|
58
81
|
self._metrics_armed = False
|
|
@@ -71,7 +94,12 @@ class LoopBase(_zuvloop.Loop, asyncio.AbstractEventLoop): # type: ignore[misc]
|
|
|
71
94
|
wakeup_fd = self._csock.fileno()
|
|
72
95
|
try:
|
|
73
96
|
self._defer_close(
|
|
74
|
-
partial(
|
|
97
|
+
partial(
|
|
98
|
+
_finish_deferred_signal_cleanup,
|
|
99
|
+
tuple(self._signal_handlers),
|
|
100
|
+
wakeup_fd,
|
|
101
|
+
self._signal_owner,
|
|
102
|
+
)
|
|
75
103
|
)
|
|
76
104
|
except BaseException: # pragma: no cover - CPython pending-call queue exhaustion
|
|
77
105
|
try:
|
|
@@ -106,9 +134,9 @@ class LoopBase(_zuvloop.Loop, asyncio.AbstractEventLoop): # type: ignore[misc]
|
|
|
106
134
|
sys.set_asyncgen_hooks(firstiter=self._asyncgen_firstiter, finalizer=self._asyncgen_finalizer)
|
|
107
135
|
self._monitoring_armed = instrumentation_provider_installed()
|
|
108
136
|
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)
|
|
111
137
|
try:
|
|
138
|
+
self._set_slow_callback_monitoring(self._monitoring_armed)
|
|
139
|
+
self._start_metrics(self.metrics_interval, self._on_sample)
|
|
112
140
|
self._run()
|
|
113
141
|
finally:
|
|
114
142
|
self._set_slow_callback_monitoring(False)
|
|
@@ -302,12 +330,56 @@ class LoopBase(_zuvloop.Loop, asyncio.AbstractEventLoop): # type: ignore[misc]
|
|
|
302
330
|
self._ssock.close()
|
|
303
331
|
self._csock.close()
|
|
304
332
|
|
|
305
|
-
def _attach_wakeup_fd(self) -> None:
|
|
333
|
+
def _attach_wakeup_fd(self) -> WakeupState | None:
|
|
306
334
|
# Only the main thread may own the wakeup fd, and only it runs Python
|
|
307
335
|
# signal handlers - so a loop on any other thread simply skips this.
|
|
308
336
|
if threading.current_thread() is threading.main_thread() and self._signal_handlers:
|
|
309
|
-
|
|
337
|
+
global _wakeup_fd_owner
|
|
338
|
+
previous_owner = _wakeup_fd_owner
|
|
339
|
+
previous_attached = self._wakeup_fd_attached
|
|
340
|
+
# Publish the provisional token before the syscall. A pending old
|
|
341
|
+
# cleanup can run as soon as the C call returns; it must already see
|
|
342
|
+
# that the descriptor has changed hands.
|
|
343
|
+
_wakeup_fd_owner = self._signal_owner
|
|
344
|
+
try:
|
|
345
|
+
previous_fd = signal.set_wakeup_fd(self._csock.fileno())
|
|
346
|
+
except OSError:
|
|
347
|
+
if previous_owner is None or not previous_owner.is_finalized():
|
|
348
|
+
_wakeup_fd_owner = previous_owner
|
|
349
|
+
else:
|
|
350
|
+
# A skipped stale cleanup may have closed its descriptor;
|
|
351
|
+
# never put that invalid owner back.
|
|
352
|
+
signal.set_wakeup_fd(-1)
|
|
353
|
+
_wakeup_fd_owner = None
|
|
354
|
+
raise
|
|
310
355
|
self._wakeup_fd_attached = True
|
|
356
|
+
return WakeupState(previous_fd, previous_owner, previous_attached)
|
|
357
|
+
return None
|
|
358
|
+
|
|
359
|
+
def _restore_wakeup_fd(self, previous: WakeupState | None) -> None:
|
|
360
|
+
if previous is None:
|
|
361
|
+
return
|
|
362
|
+
global _wakeup_fd_owner
|
|
363
|
+
# Stale cleanup skips a replacement token, so this transaction remains
|
|
364
|
+
# the wakeup owner until it either commits or restores this snapshot.
|
|
365
|
+
assert _wakeup_fd_owner is self._signal_owner
|
|
366
|
+
abandon = previous.owner is not None and previous.owner.is_finalized()
|
|
367
|
+
try:
|
|
368
|
+
signal.set_wakeup_fd(-1 if abandon else previous.fd)
|
|
369
|
+
except OSError: # pragma: no cover - fd closed between check and syscall
|
|
370
|
+
# Finalization may close fd after the check but before the syscall.
|
|
371
|
+
signal.set_wakeup_fd(-1)
|
|
372
|
+
abandon = True
|
|
373
|
+
_wakeup_fd_owner = None if abandon else previous.owner
|
|
374
|
+
self._wakeup_fd_attached = False if abandon else previous.was_attached
|
|
375
|
+
# Revalidate after publishing: cleanup can run between any two Python
|
|
376
|
+
# operations above. If it did, never leave its closed fd reinstalled.
|
|
377
|
+
if ( # pragma: no cover - defensive recheck after deferred cleanup
|
|
378
|
+
previous.owner is not None and previous.owner.is_finalized() and _wakeup_fd_owner is previous.owner
|
|
379
|
+
):
|
|
380
|
+
signal.set_wakeup_fd(-1)
|
|
381
|
+
_wakeup_fd_owner = None
|
|
382
|
+
self._wakeup_fd_attached = False
|
|
311
383
|
|
|
312
384
|
def _detach_wakeup_fd(self) -> None:
|
|
313
385
|
# Registered handlers must keep the fd active between separate calls
|
|
@@ -318,7 +390,10 @@ class LoopBase(_zuvloop.Loop, asyncio.AbstractEventLoop): # type: ignore[misc]
|
|
|
318
390
|
and self._wakeup_fd_attached
|
|
319
391
|
and not self._signal_handlers
|
|
320
392
|
):
|
|
321
|
-
|
|
393
|
+
global _wakeup_fd_owner
|
|
394
|
+
if _wakeup_fd_owner is self._signal_owner:
|
|
395
|
+
signal.set_wakeup_fd(-1)
|
|
396
|
+
_wakeup_fd_owner = None
|
|
322
397
|
self._wakeup_fd_attached = False
|
|
323
398
|
|
|
324
399
|
def _add_reader(self, fd: int, callback: Callable[..., object], *args: object) -> None:
|
|
@@ -343,7 +418,13 @@ class LoopBase(_zuvloop.Loop, asyncio.AbstractEventLoop): # type: ignore[misc]
|
|
|
343
418
|
"""
|
|
344
419
|
try:
|
|
345
420
|
while True:
|
|
346
|
-
|
|
421
|
+
data = sock.recv(4096)
|
|
422
|
+
if not data:
|
|
423
|
+
# EOF remains level-triggered readable forever. Stop
|
|
424
|
+
# watching this dead pipe or the loop will spin on it.
|
|
425
|
+
self.remove_reader(sock.fileno())
|
|
426
|
+
break
|
|
427
|
+
for signum in data:
|
|
347
428
|
self._dispatch_signal(signum)
|
|
348
429
|
except BlockingIOError, InterruptedError:
|
|
349
430
|
pass
|
|
@@ -360,12 +441,18 @@ def _stop_when_done(future: asyncio.Future[Any]) -> None:
|
|
|
360
441
|
asyncio.futures._get_loop(future).stop() # type: ignore[attr-defined]
|
|
361
442
|
|
|
362
443
|
|
|
363
|
-
def _finish_deferred_signal_cleanup(signals: tuple[int, ...], wakeup_fd: int) -> None:
|
|
364
|
-
|
|
444
|
+
def _finish_deferred_signal_cleanup(signals: tuple[int, ...], wakeup_fd: int, owner: SignalOwner) -> None:
|
|
445
|
+
global _wakeup_fd_owner
|
|
446
|
+
owner.finalized = True
|
|
447
|
+
if _wakeup_fd_owner is owner:
|
|
448
|
+
signal.set_wakeup_fd(-1)
|
|
449
|
+
_wakeup_fd_owner = None
|
|
365
450
|
try:
|
|
366
451
|
for sig in signals:
|
|
367
|
-
|
|
368
|
-
|
|
452
|
+
if _signal_owners.get(sig) is owner:
|
|
453
|
+
del _signal_owners[sig]
|
|
454
|
+
handler = signal.default_int_handler if sig == signal.SIGINT else signal.SIG_DFL
|
|
455
|
+
signal.signal(sig, handler)
|
|
369
456
|
finally:
|
|
370
457
|
os.close(wakeup_fd)
|
|
371
458
|
|
|
@@ -913,7 +913,7 @@ class _SubprocessTransport(base_subprocess.BaseSubprocessTransport):
|
|
|
913
913
|
assert self._proc is not None
|
|
914
914
|
try:
|
|
915
915
|
self._proc.send_signal(signal_number)
|
|
916
|
-
except ProcessLookupError:
|
|
916
|
+
except ProcessLookupError: # pragma: no cover - pid exit race
|
|
917
917
|
pass
|
|
918
918
|
|
|
919
919
|
def terminate(self) -> None:
|
|
@@ -99,7 +99,7 @@ def capture_call_graph(handle: object = None) -> str | None:
|
|
|
99
99
|
task = getattr(getattr(handle, "_callback", None), "__self__", None)
|
|
100
100
|
if not isinstance(task, asyncio.Task):
|
|
101
101
|
task = asyncio.current_task()
|
|
102
|
-
if task is None:
|
|
102
|
+
if task is None or task.done():
|
|
103
103
|
return None
|
|
104
104
|
return asyncio.format_call_graph(task)
|
|
105
105
|
|