zuvloop 0.0.1__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.1/.gitignore +24 -0
- zuvloop-0.0.1/LICENSE +21 -0
- zuvloop-0.0.1/PKG-INFO +222 -0
- zuvloop-0.0.1/README.md +198 -0
- zuvloop-0.0.1/build.zig +134 -0
- zuvloop-0.0.1/build.zig.zon +12 -0
- zuvloop-0.0.1/pyproject.toml +120 -0
- zuvloop-0.0.1/vendor/README.md +13 -0
- zuvloop-0.0.1/vendor/libuv/.gitattributes +1 -0
- zuvloop-0.0.1/vendor/libuv/.github/ISSUE_TEMPLATE.md +13 -0
- zuvloop-0.0.1/vendor/libuv/.github/dependabot.yml +7 -0
- zuvloop-0.0.1/vendor/libuv/.github/workflows/CI-docs.yml +25 -0
- zuvloop-0.0.1/vendor/libuv/.github/workflows/CI-sample.yml +33 -0
- zuvloop-0.0.1/vendor/libuv/.github/workflows/CI-unix.yml +182 -0
- zuvloop-0.0.1/vendor/libuv/.github/workflows/CI-win.yml +128 -0
- zuvloop-0.0.1/vendor/libuv/.github/workflows/sanitizer.yml +128 -0
- zuvloop-0.0.1/vendor/libuv/.gitignore +80 -0
- zuvloop-0.0.1/vendor/libuv/.mailmap +71 -0
- zuvloop-0.0.1/vendor/libuv/.readthedocs.yaml +15 -0
- zuvloop-0.0.1/vendor/libuv/AUTHORS +606 -0
- zuvloop-0.0.1/vendor/libuv/CMakeLists.txt +816 -0
- zuvloop-0.0.1/vendor/libuv/CONTRIBUTING.md +171 -0
- zuvloop-0.0.1/vendor/libuv/ChangeLog +6522 -0
- zuvloop-0.0.1/vendor/libuv/LICENSE +19 -0
- zuvloop-0.0.1/vendor/libuv/LICENSE-docs +396 -0
- zuvloop-0.0.1/vendor/libuv/LICENSE-extra +36 -0
- zuvloop-0.0.1/vendor/libuv/LINKS.md +112 -0
- zuvloop-0.0.1/vendor/libuv/MAINTAINERS.md +56 -0
- zuvloop-0.0.1/vendor/libuv/Makefile.am +563 -0
- zuvloop-0.0.1/vendor/libuv/README.md +355 -0
- zuvloop-0.0.1/vendor/libuv/SECURITY.md +27 -0
- zuvloop-0.0.1/vendor/libuv/SUPPORTED_PLATFORMS.md +68 -0
- zuvloop-0.0.1/vendor/libuv/autogen.sh +75 -0
- zuvloop-0.0.1/vendor/libuv/cmake-toolchains/cross-mingw32.cmake +17 -0
- zuvloop-0.0.1/vendor/libuv/configure.ac +92 -0
- zuvloop-0.0.1/vendor/libuv/docs/code/.gitignore +3 -0
- zuvloop-0.0.1/vendor/libuv/docs/code/CMakeLists.txt +51 -0
- zuvloop-0.0.1/vendor/libuv/docs/code/cgi/main.c +81 -0
- zuvloop-0.0.1/vendor/libuv/docs/code/cgi/tick.c +13 -0
- zuvloop-0.0.1/vendor/libuv/docs/code/default-loop/main.c +12 -0
- zuvloop-0.0.1/vendor/libuv/docs/code/detach/main.c +31 -0
- zuvloop-0.0.1/vendor/libuv/docs/code/dns/main.c +80 -0
- zuvloop-0.0.1/vendor/libuv/docs/code/helloworld/main.c +15 -0
- zuvloop-0.0.1/vendor/libuv/docs/code/idle-basic/main.c +24 -0
- zuvloop-0.0.1/vendor/libuv/docs/code/idle-compute/main.c +43 -0
- zuvloop-0.0.1/vendor/libuv/docs/code/interfaces/main.c +33 -0
- zuvloop-0.0.1/vendor/libuv/docs/code/locks/main.c +57 -0
- zuvloop-0.0.1/vendor/libuv/docs/code/multi-echo-server/main.c +114 -0
- zuvloop-0.0.1/vendor/libuv/docs/code/multi-echo-server/worker.c +88 -0
- zuvloop-0.0.1/vendor/libuv/docs/code/onchange/main.c +44 -0
- zuvloop-0.0.1/vendor/libuv/docs/code/pipe-echo-server/main.c +94 -0
- zuvloop-0.0.1/vendor/libuv/docs/code/plugin/hello.c +5 -0
- zuvloop-0.0.1/vendor/libuv/docs/code/plugin/main.c +38 -0
- zuvloop-0.0.1/vendor/libuv/docs/code/plugin/plugin.h +7 -0
- zuvloop-0.0.1/vendor/libuv/docs/code/proc-streams/main.c +49 -0
- zuvloop-0.0.1/vendor/libuv/docs/code/proc-streams/test.c +8 -0
- zuvloop-0.0.1/vendor/libuv/docs/code/progress/main.c +47 -0
- zuvloop-0.0.1/vendor/libuv/docs/code/queue-cancel/main.c +59 -0
- zuvloop-0.0.1/vendor/libuv/docs/code/queue-work/main.c +44 -0
- zuvloop-0.0.1/vendor/libuv/docs/code/ref-timer/main.c +29 -0
- zuvloop-0.0.1/vendor/libuv/docs/code/signal/main.c +66 -0
- zuvloop-0.0.1/vendor/libuv/docs/code/spawn/main.c +36 -0
- zuvloop-0.0.1/vendor/libuv/docs/code/tcp-echo-server/main.c +87 -0
- zuvloop-0.0.1/vendor/libuv/docs/code/thread-create/main.c +35 -0
- zuvloop-0.0.1/vendor/libuv/docs/code/tty/main.c +31 -0
- zuvloop-0.0.1/vendor/libuv/docs/code/tty-gravity/main.c +48 -0
- zuvloop-0.0.1/vendor/libuv/docs/code/udp-dhcp/main.c +128 -0
- zuvloop-0.0.1/vendor/libuv/docs/code/uvcat/main.c +62 -0
- zuvloop-0.0.1/vendor/libuv/docs/code/uvstop/main.c +33 -0
- zuvloop-0.0.1/vendor/libuv/docs/code/uvtee/main.c +79 -0
- zuvloop-0.0.1/vendor/libuv/docs/code/uvwget/main.c +166 -0
- zuvloop-0.0.1/vendor/libuv/docs/make.bat +243 -0
- zuvloop-0.0.1/vendor/libuv/docs/requirements.txt +36 -0
- zuvloop-0.0.1/vendor/libuv/docs/src/api.rst +36 -0
- zuvloop-0.0.1/vendor/libuv/docs/src/async.rst +65 -0
- zuvloop-0.0.1/vendor/libuv/docs/src/check.rst +54 -0
- zuvloop-0.0.1/vendor/libuv/docs/src/conf.py +348 -0
- zuvloop-0.0.1/vendor/libuv/docs/src/design.rst +141 -0
- zuvloop-0.0.1/vendor/libuv/docs/src/dll.rst +44 -0
- zuvloop-0.0.1/vendor/libuv/docs/src/dns.rst +108 -0
- zuvloop-0.0.1/vendor/libuv/docs/src/errors.rst +388 -0
- zuvloop-0.0.1/vendor/libuv/docs/src/fs.rst +727 -0
- zuvloop-0.0.1/vendor/libuv/docs/src/fs_event.rst +144 -0
- zuvloop-0.0.1/vendor/libuv/docs/src/fs_poll.rst +77 -0
- zuvloop-0.0.1/vendor/libuv/docs/src/guide/about.rst +22 -0
- zuvloop-0.0.1/vendor/libuv/docs/src/guide/basics.rst +236 -0
- zuvloop-0.0.1/vendor/libuv/docs/src/guide/eventloops.rst +50 -0
- zuvloop-0.0.1/vendor/libuv/docs/src/guide/filesystem.rst +349 -0
- zuvloop-0.0.1/vendor/libuv/docs/src/guide/introduction.rst +73 -0
- zuvloop-0.0.1/vendor/libuv/docs/src/guide/networking.rst +256 -0
- zuvloop-0.0.1/vendor/libuv/docs/src/guide/processes.rst +424 -0
- zuvloop-0.0.1/vendor/libuv/docs/src/guide/threads.rst +397 -0
- zuvloop-0.0.1/vendor/libuv/docs/src/guide/utilities.rst +450 -0
- zuvloop-0.0.1/vendor/libuv/docs/src/guide.rst +22 -0
- zuvloop-0.0.1/vendor/libuv/docs/src/handle.rst +286 -0
- zuvloop-0.0.1/vendor/libuv/docs/src/idle.rst +62 -0
- zuvloop-0.0.1/vendor/libuv/docs/src/index.rst +62 -0
- zuvloop-0.0.1/vendor/libuv/docs/src/loop.rst +263 -0
- zuvloop-0.0.1/vendor/libuv/docs/src/metrics.rst +71 -0
- zuvloop-0.0.1/vendor/libuv/docs/src/migration_010_100.rst +244 -0
- zuvloop-0.0.1/vendor/libuv/docs/src/misc.rst +940 -0
- zuvloop-0.0.1/vendor/libuv/docs/src/pipe.rst +182 -0
- zuvloop-0.0.1/vendor/libuv/docs/src/poll.rst +150 -0
- zuvloop-0.0.1/vendor/libuv/docs/src/prepare.rst +54 -0
- zuvloop-0.0.1/vendor/libuv/docs/src/process.rst +291 -0
- zuvloop-0.0.1/vendor/libuv/docs/src/request.rst +121 -0
- zuvloop-0.0.1/vendor/libuv/docs/src/signal.rst +101 -0
- zuvloop-0.0.1/vendor/libuv/docs/src/sphinx-plugins/manpage.py +45 -0
- zuvloop-0.0.1/vendor/libuv/docs/src/static/architecture.png +0 -0
- zuvloop-0.0.1/vendor/libuv/docs/src/static/diagrams.key/Data/st0-311.jpg +0 -0
- zuvloop-0.0.1/vendor/libuv/docs/src/static/diagrams.key/Data/st1-475.jpg +0 -0
- zuvloop-0.0.1/vendor/libuv/docs/src/static/diagrams.key/Index.zip +0 -0
- zuvloop-0.0.1/vendor/libuv/docs/src/static/diagrams.key/Metadata/BuildVersionHistory.plist +8 -0
- zuvloop-0.0.1/vendor/libuv/docs/src/static/diagrams.key/Metadata/DocumentIdentifier +1 -0
- zuvloop-0.0.1/vendor/libuv/docs/src/static/diagrams.key/Metadata/Properties.plist +0 -0
- zuvloop-0.0.1/vendor/libuv/docs/src/static/diagrams.key/preview-micro.jpg +0 -0
- zuvloop-0.0.1/vendor/libuv/docs/src/static/diagrams.key/preview-web.jpg +0 -0
- zuvloop-0.0.1/vendor/libuv/docs/src/static/diagrams.key/preview.jpg +0 -0
- zuvloop-0.0.1/vendor/libuv/docs/src/static/favicon.ico +0 -0
- zuvloop-0.0.1/vendor/libuv/docs/src/static/logo.png +0 -0
- zuvloop-0.0.1/vendor/libuv/docs/src/static/loop_iteration.png +0 -0
- zuvloop-0.0.1/vendor/libuv/docs/src/stream.rst +258 -0
- zuvloop-0.0.1/vendor/libuv/docs/src/tcp.rst +190 -0
- zuvloop-0.0.1/vendor/libuv/docs/src/threading.rst +284 -0
- zuvloop-0.0.1/vendor/libuv/docs/src/threadpool.rst +74 -0
- zuvloop-0.0.1/vendor/libuv/docs/src/timer.rst +92 -0
- zuvloop-0.0.1/vendor/libuv/docs/src/tty.rst +145 -0
- zuvloop-0.0.1/vendor/libuv/docs/src/udp.rst +501 -0
- zuvloop-0.0.1/vendor/libuv/docs/src/upgrading.rst +11 -0
- zuvloop-0.0.1/vendor/libuv/docs/src/version.rst +60 -0
- zuvloop-0.0.1/vendor/libuv/img/banner.png +0 -0
- zuvloop-0.0.1/vendor/libuv/img/logos.svg +152 -0
- zuvloop-0.0.1/vendor/libuv/include/uv/aix.h +32 -0
- zuvloop-0.0.1/vendor/libuv/include/uv/bsd.h +34 -0
- zuvloop-0.0.1/vendor/libuv/include/uv/darwin.h +61 -0
- zuvloop-0.0.1/vendor/libuv/include/uv/errno.h +483 -0
- zuvloop-0.0.1/vendor/libuv/include/uv/linux.h +34 -0
- zuvloop-0.0.1/vendor/libuv/include/uv/os390.h +33 -0
- zuvloop-0.0.1/vendor/libuv/include/uv/posix.h +31 -0
- zuvloop-0.0.1/vendor/libuv/include/uv/sunos.h +44 -0
- zuvloop-0.0.1/vendor/libuv/include/uv/threadpool.h +37 -0
- zuvloop-0.0.1/vendor/libuv/include/uv/tree.h +521 -0
- zuvloop-0.0.1/vendor/libuv/include/uv/unix.h +512 -0
- zuvloop-0.0.1/vendor/libuv/include/uv/version.h +43 -0
- zuvloop-0.0.1/vendor/libuv/include/uv/win.h +698 -0
- zuvloop-0.0.1/vendor/libuv/include/uv.h +1990 -0
- zuvloop-0.0.1/vendor/libuv/libuv-static.pc.in +12 -0
- zuvloop-0.0.1/vendor/libuv/libuv.pc.in +13 -0
- zuvloop-0.0.1/vendor/libuv/m4/.gitignore +5 -0
- zuvloop-0.0.1/vendor/libuv/m4/as_case.m4 +21 -0
- zuvloop-0.0.1/vendor/libuv/m4/ax_pthread.m4 +485 -0
- zuvloop-0.0.1/vendor/libuv/m4/libuv-check-flags.m4 +336 -0
- zuvloop-0.0.1/vendor/libuv/src/fs-poll.c +290 -0
- zuvloop-0.0.1/vendor/libuv/src/heap-inl.h +245 -0
- zuvloop-0.0.1/vendor/libuv/src/idna.c +560 -0
- zuvloop-0.0.1/vendor/libuv/src/idna.h +31 -0
- zuvloop-0.0.1/vendor/libuv/src/inet.c +298 -0
- zuvloop-0.0.1/vendor/libuv/src/queue.h +90 -0
- zuvloop-0.0.1/vendor/libuv/src/random.c +123 -0
- zuvloop-0.0.1/vendor/libuv/src/strscpy.c +38 -0
- zuvloop-0.0.1/vendor/libuv/src/strscpy.h +39 -0
- zuvloop-0.0.1/vendor/libuv/src/strtok.c +52 -0
- zuvloop-0.0.1/vendor/libuv/src/strtok.h +27 -0
- zuvloop-0.0.1/vendor/libuv/src/thread-common.c +175 -0
- zuvloop-0.0.1/vendor/libuv/src/threadpool.c +419 -0
- zuvloop-0.0.1/vendor/libuv/src/timer.c +200 -0
- zuvloop-0.0.1/vendor/libuv/src/unix/aix-common.c +89 -0
- zuvloop-0.0.1/vendor/libuv/src/unix/aix.c +1321 -0
- zuvloop-0.0.1/vendor/libuv/src/unix/async.c +418 -0
- zuvloop-0.0.1/vendor/libuv/src/unix/bsd-ifaddrs.c +164 -0
- zuvloop-0.0.1/vendor/libuv/src/unix/bsd-proctitle.c +99 -0
- zuvloop-0.0.1/vendor/libuv/src/unix/core.c +2104 -0
- zuvloop-0.0.1/vendor/libuv/src/unix/cygwin.c +93 -0
- zuvloop-0.0.1/vendor/libuv/src/unix/darwin-proctitle.c +176 -0
- zuvloop-0.0.1/vendor/libuv/src/unix/darwin-stub.h +97 -0
- zuvloop-0.0.1/vendor/libuv/src/unix/darwin-syscalls.h +17 -0
- zuvloop-0.0.1/vendor/libuv/src/unix/darwin.c +237 -0
- zuvloop-0.0.1/vendor/libuv/src/unix/dl.c +80 -0
- zuvloop-0.0.1/vendor/libuv/src/unix/freebsd.c +290 -0
- zuvloop-0.0.1/vendor/libuv/src/unix/fs.c +2303 -0
- zuvloop-0.0.1/vendor/libuv/src/unix/fsevents.c +906 -0
- zuvloop-0.0.1/vendor/libuv/src/unix/getaddrinfo.c +252 -0
- zuvloop-0.0.1/vendor/libuv/src/unix/getnameinfo.c +121 -0
- zuvloop-0.0.1/vendor/libuv/src/unix/haiku.c +172 -0
- zuvloop-0.0.1/vendor/libuv/src/unix/hurd.c +172 -0
- zuvloop-0.0.1/vendor/libuv/src/unix/ibmi.c +545 -0
- zuvloop-0.0.1/vendor/libuv/src/unix/internal.h +530 -0
- zuvloop-0.0.1/vendor/libuv/src/unix/kqueue.c +667 -0
- zuvloop-0.0.1/vendor/libuv/src/unix/linux.c +2761 -0
- zuvloop-0.0.1/vendor/libuv/src/unix/loop-watcher.c +68 -0
- zuvloop-0.0.1/vendor/libuv/src/unix/loop.c +240 -0
- zuvloop-0.0.1/vendor/libuv/src/unix/netbsd.c +264 -0
- zuvloop-0.0.1/vendor/libuv/src/unix/no-fsevents.c +42 -0
- zuvloop-0.0.1/vendor/libuv/src/unix/no-proctitle.c +45 -0
- zuvloop-0.0.1/vendor/libuv/src/unix/openbsd.c +253 -0
- zuvloop-0.0.1/vendor/libuv/src/unix/os390-proctitle.c +136 -0
- zuvloop-0.0.1/vendor/libuv/src/unix/os390-syscalls.c +536 -0
- zuvloop-0.0.1/vendor/libuv/src/unix/os390-syscalls.h +75 -0
- zuvloop-0.0.1/vendor/libuv/src/unix/os390.c +1070 -0
- zuvloop-0.0.1/vendor/libuv/src/unix/pipe.c +555 -0
- zuvloop-0.0.1/vendor/libuv/src/unix/poll.c +159 -0
- zuvloop-0.0.1/vendor/libuv/src/unix/posix-hrtime.c +36 -0
- zuvloop-0.0.1/vendor/libuv/src/unix/posix-poll.c +385 -0
- zuvloop-0.0.1/vendor/libuv/src/unix/process.c +1123 -0
- zuvloop-0.0.1/vendor/libuv/src/unix/procfs-exepath.c +45 -0
- zuvloop-0.0.1/vendor/libuv/src/unix/proctitle.c +157 -0
- zuvloop-0.0.1/vendor/libuv/src/unix/qnx.c +142 -0
- zuvloop-0.0.1/vendor/libuv/src/unix/random-devurandom.c +93 -0
- zuvloop-0.0.1/vendor/libuv/src/unix/random-getentropy.c +57 -0
- zuvloop-0.0.1/vendor/libuv/src/unix/random-getrandom.c +86 -0
- zuvloop-0.0.1/vendor/libuv/src/unix/random-sysctl-linux.c +99 -0
- zuvloop-0.0.1/vendor/libuv/src/unix/signal.c +581 -0
- zuvloop-0.0.1/vendor/libuv/src/unix/stream.c +1567 -0
- zuvloop-0.0.1/vendor/libuv/src/unix/sunos.c +915 -0
- zuvloop-0.0.1/vendor/libuv/src/unix/sysinfo-loadavg.c +36 -0
- zuvloop-0.0.1/vendor/libuv/src/unix/sysinfo-memory.c +42 -0
- zuvloop-0.0.1/vendor/libuv/src/unix/tcp.c +673 -0
- zuvloop-0.0.1/vendor/libuv/src/unix/thread.c +975 -0
- zuvloop-0.0.1/vendor/libuv/src/unix/tty.c +510 -0
- zuvloop-0.0.1/vendor/libuv/src/unix/udp.c +1434 -0
- zuvloop-0.0.1/vendor/libuv/src/uv-common.c +1051 -0
- zuvloop-0.0.1/vendor/libuv/src/uv-common.h +474 -0
- zuvloop-0.0.1/vendor/libuv/src/uv-data-getter-setters.c +119 -0
- zuvloop-0.0.1/vendor/libuv/src/version.c +45 -0
- zuvloop-0.0.1/vendor/libuv/src/win/async.c +98 -0
- zuvloop-0.0.1/vendor/libuv/src/win/atomicops-inl.h +61 -0
- zuvloop-0.0.1/vendor/libuv/src/win/core.c +683 -0
- zuvloop-0.0.1/vendor/libuv/src/win/detect-wakeup.c +56 -0
- zuvloop-0.0.1/vendor/libuv/src/win/dl.c +135 -0
- zuvloop-0.0.1/vendor/libuv/src/win/error.c +183 -0
- zuvloop-0.0.1/vendor/libuv/src/win/fs-event.c +620 -0
- zuvloop-0.0.1/vendor/libuv/src/win/fs-fd-hash-inl.h +200 -0
- zuvloop-0.0.1/vendor/libuv/src/win/fs.c +3774 -0
- zuvloop-0.0.1/vendor/libuv/src/win/getaddrinfo.c +388 -0
- zuvloop-0.0.1/vendor/libuv/src/win/getnameinfo.c +146 -0
- zuvloop-0.0.1/vendor/libuv/src/win/handle-inl.h +180 -0
- zuvloop-0.0.1/vendor/libuv/src/win/handle.c +162 -0
- zuvloop-0.0.1/vendor/libuv/src/win/internal.h +335 -0
- zuvloop-0.0.1/vendor/libuv/src/win/loop-watcher.c +122 -0
- zuvloop-0.0.1/vendor/libuv/src/win/pipe.c +2725 -0
- zuvloop-0.0.1/vendor/libuv/src/win/poll.c +586 -0
- zuvloop-0.0.1/vendor/libuv/src/win/process-stdio.c +419 -0
- zuvloop-0.0.1/vendor/libuv/src/win/process.c +1407 -0
- zuvloop-0.0.1/vendor/libuv/src/win/req-inl.h +214 -0
- zuvloop-0.0.1/vendor/libuv/src/win/signal.c +282 -0
- zuvloop-0.0.1/vendor/libuv/src/win/snprintf.c +42 -0
- zuvloop-0.0.1/vendor/libuv/src/win/stream-inl.h +54 -0
- zuvloop-0.0.1/vendor/libuv/src/win/stream.c +252 -0
- zuvloop-0.0.1/vendor/libuv/src/win/tcp.c +1674 -0
- zuvloop-0.0.1/vendor/libuv/src/win/thread.c +568 -0
- zuvloop-0.0.1/vendor/libuv/src/win/tty.c +2460 -0
- zuvloop-0.0.1/vendor/libuv/src/win/udp.c +1162 -0
- zuvloop-0.0.1/vendor/libuv/src/win/util.c +1750 -0
- zuvloop-0.0.1/vendor/libuv/src/win/winapi.c +144 -0
- zuvloop-0.0.1/vendor/libuv/src/win/winapi.h +4831 -0
- zuvloop-0.0.1/vendor/libuv/src/win/winsock.c +575 -0
- zuvloop-0.0.1/vendor/libuv/src/win/winsock.h +160 -0
- zuvloop-0.0.1/vendor/libuv/test/benchmark-async-pummel.c +120 -0
- zuvloop-0.0.1/vendor/libuv/test/benchmark-async.c +142 -0
- zuvloop-0.0.1/vendor/libuv/test/benchmark-fs-stat.c +138 -0
- zuvloop-0.0.1/vendor/libuv/test/benchmark-getaddrinfo.c +92 -0
- zuvloop-0.0.1/vendor/libuv/test/benchmark-list.h +173 -0
- zuvloop-0.0.1/vendor/libuv/test/benchmark-loop-count.c +134 -0
- zuvloop-0.0.1/vendor/libuv/test/benchmark-million-async.c +113 -0
- zuvloop-0.0.1/vendor/libuv/test/benchmark-million-timers.c +86 -0
- zuvloop-0.0.1/vendor/libuv/test/benchmark-multi-accept.c +451 -0
- zuvloop-0.0.1/vendor/libuv/test/benchmark-ping-pongs.c +221 -0
- zuvloop-0.0.1/vendor/libuv/test/benchmark-ping-udp.c +169 -0
- zuvloop-0.0.1/vendor/libuv/test/benchmark-pound.c +351 -0
- zuvloop-0.0.1/vendor/libuv/test/benchmark-pump.c +478 -0
- zuvloop-0.0.1/vendor/libuv/test/benchmark-queue-work.c +71 -0
- zuvloop-0.0.1/vendor/libuv/test/benchmark-sizes.c +46 -0
- zuvloop-0.0.1/vendor/libuv/test/benchmark-spawn.c +164 -0
- zuvloop-0.0.1/vendor/libuv/test/benchmark-tcp-write-batch.c +144 -0
- zuvloop-0.0.1/vendor/libuv/test/benchmark-thread.c +64 -0
- zuvloop-0.0.1/vendor/libuv/test/benchmark-udp-pummel.c +243 -0
- zuvloop-0.0.1/vendor/libuv/test/blackhole-server.c +122 -0
- zuvloop-0.0.1/vendor/libuv/test/echo-server.c +431 -0
- zuvloop-0.0.1/vendor/libuv/test/fixtures/empty_file +0 -0
- zuvloop-0.0.1/vendor/libuv/test/fixtures/load_error.node +1 -0
- zuvloop-0.0.1/vendor/libuv/test/fixtures/lorem_ipsum.txt +1 -0
- zuvloop-0.0.1/vendor/libuv/test/fixtures/one_file/one_file +0 -0
- zuvloop-0.0.1/vendor/libuv/test/run-benchmarks.c +72 -0
- zuvloop-0.0.1/vendor/libuv/test/run-tests.c +269 -0
- zuvloop-0.0.1/vendor/libuv/test/runner-unix.c +457 -0
- zuvloop-0.0.1/vendor/libuv/test/runner-unix.h +36 -0
- zuvloop-0.0.1/vendor/libuv/test/runner-win.c +348 -0
- zuvloop-0.0.1/vendor/libuv/test/runner-win.h +41 -0
- zuvloop-0.0.1/vendor/libuv/test/runner.c +457 -0
- zuvloop-0.0.1/vendor/libuv/test/runner.h +172 -0
- zuvloop-0.0.1/vendor/libuv/test/task.h +388 -0
- zuvloop-0.0.1/vendor/libuv/test/test-active.c +84 -0
- zuvloop-0.0.1/vendor/libuv/test/test-async-null-cb.c +64 -0
- zuvloop-0.0.1/vendor/libuv/test/test-async.c +134 -0
- zuvloop-0.0.1/vendor/libuv/test/test-barrier.c +160 -0
- zuvloop-0.0.1/vendor/libuv/test/test-callback-stack.c +209 -0
- zuvloop-0.0.1/vendor/libuv/test/test-close-fd.c +84 -0
- zuvloop-0.0.1/vendor/libuv/test/test-close-order.c +80 -0
- zuvloop-0.0.1/vendor/libuv/test/test-condvar.c +248 -0
- zuvloop-0.0.1/vendor/libuv/test/test-connect-unspecified.c +60 -0
- zuvloop-0.0.1/vendor/libuv/test/test-connection-fail.c +161 -0
- zuvloop-0.0.1/vendor/libuv/test/test-cwd-and-chdir.c +57 -0
- zuvloop-0.0.1/vendor/libuv/test/test-default-loop-close.c +58 -0
- zuvloop-0.0.1/vendor/libuv/test/test-delayed-accept.c +189 -0
- zuvloop-0.0.1/vendor/libuv/test/test-dlerror.c +65 -0
- zuvloop-0.0.1/vendor/libuv/test/test-eintr-handling.c +96 -0
- zuvloop-0.0.1/vendor/libuv/test/test-embed.c +79 -0
- zuvloop-0.0.1/vendor/libuv/test/test-emfile.c +129 -0
- zuvloop-0.0.1/vendor/libuv/test/test-env-vars.c +178 -0
- zuvloop-0.0.1/vendor/libuv/test/test-error.c +82 -0
- zuvloop-0.0.1/vendor/libuv/test/test-fail-always.c +29 -0
- zuvloop-0.0.1/vendor/libuv/test/test-fork.c +769 -0
- zuvloop-0.0.1/vendor/libuv/test/test-fs-copyfile.c +232 -0
- zuvloop-0.0.1/vendor/libuv/test/test-fs-event.c +1220 -0
- zuvloop-0.0.1/vendor/libuv/test/test-fs-fd-hash.c +133 -0
- zuvloop-0.0.1/vendor/libuv/test/test-fs-open-flags.c +435 -0
- zuvloop-0.0.1/vendor/libuv/test/test-fs-poll.c +292 -0
- zuvloop-0.0.1/vendor/libuv/test/test-fs-readdir.c +548 -0
- zuvloop-0.0.1/vendor/libuv/test/test-fs.c +4922 -0
- zuvloop-0.0.1/vendor/libuv/test/test-get-currentexe.c +109 -0
- zuvloop-0.0.1/vendor/libuv/test/test-get-loadavg.c +35 -0
- zuvloop-0.0.1/vendor/libuv/test/test-get-memory.c +53 -0
- zuvloop-0.0.1/vendor/libuv/test/test-get-passwd.c +211 -0
- zuvloop-0.0.1/vendor/libuv/test/test-getaddrinfo.c +215 -0
- zuvloop-0.0.1/vendor/libuv/test/test-gethostname.c +58 -0
- zuvloop-0.0.1/vendor/libuv/test/test-getnameinfo.c +116 -0
- zuvloop-0.0.1/vendor/libuv/test/test-getsockname.c +362 -0
- zuvloop-0.0.1/vendor/libuv/test/test-getters-setters.c +114 -0
- zuvloop-0.0.1/vendor/libuv/test/test-gettimeofday.c +39 -0
- zuvloop-0.0.1/vendor/libuv/test/test-handle-fileno.c +125 -0
- zuvloop-0.0.1/vendor/libuv/test/test-homedir.c +81 -0
- zuvloop-0.0.1/vendor/libuv/test/test-hrtime.c +65 -0
- zuvloop-0.0.1/vendor/libuv/test/test-idle.c +125 -0
- zuvloop-0.0.1/vendor/libuv/test/test-idna.c +232 -0
- zuvloop-0.0.1/vendor/libuv/test/test-iouring-pollhup.c +111 -0
- zuvloop-0.0.1/vendor/libuv/test/test-ip-name.c +65 -0
- zuvloop-0.0.1/vendor/libuv/test/test-ip4-addr.c +55 -0
- zuvloop-0.0.1/vendor/libuv/test/test-ip6-addr.c +175 -0
- zuvloop-0.0.1/vendor/libuv/test/test-ipc-heavy-traffic-deadlock-bug.c +159 -0
- zuvloop-0.0.1/vendor/libuv/test/test-ipc-send-recv.c +435 -0
- zuvloop-0.0.1/vendor/libuv/test/test-ipc.c +857 -0
- zuvloop-0.0.1/vendor/libuv/test/test-list.h +1269 -0
- zuvloop-0.0.1/vendor/libuv/test/test-loop-alive.c +68 -0
- zuvloop-0.0.1/vendor/libuv/test/test-loop-close.c +77 -0
- zuvloop-0.0.1/vendor/libuv/test/test-loop-configure.c +38 -0
- zuvloop-0.0.1/vendor/libuv/test/test-loop-handles.c +337 -0
- zuvloop-0.0.1/vendor/libuv/test/test-loop-oom.c +62 -0
- zuvloop-0.0.1/vendor/libuv/test/test-loop-stop.c +83 -0
- zuvloop-0.0.1/vendor/libuv/test/test-loop-time.c +69 -0
- zuvloop-0.0.1/vendor/libuv/test/test-metrics.c +390 -0
- zuvloop-0.0.1/vendor/libuv/test/test-multiple-listen.c +109 -0
- zuvloop-0.0.1/vendor/libuv/test/test-mutexes.c +182 -0
- zuvloop-0.0.1/vendor/libuv/test/test-not-readable-nor-writable-on-read-error.c +104 -0
- zuvloop-0.0.1/vendor/libuv/test/test-not-writable-after-shutdown.c +69 -0
- zuvloop-0.0.1/vendor/libuv/test/test-osx-select.c +140 -0
- zuvloop-0.0.1/vendor/libuv/test/test-pass-always.c +28 -0
- zuvloop-0.0.1/vendor/libuv/test/test-ping-pong.c +439 -0
- zuvloop-0.0.1/vendor/libuv/test/test-pipe-bind-error.c +215 -0
- zuvloop-0.0.1/vendor/libuv/test/test-pipe-close-stdout-read-stdin.c +122 -0
- zuvloop-0.0.1/vendor/libuv/test/test-pipe-connect-error.c +97 -0
- zuvloop-0.0.1/vendor/libuv/test/test-pipe-connect-multiple.c +178 -0
- zuvloop-0.0.1/vendor/libuv/test/test-pipe-connect-prepare.c +83 -0
- zuvloop-0.0.1/vendor/libuv/test/test-pipe-getsockname.c +370 -0
- zuvloop-0.0.1/vendor/libuv/test/test-pipe-pending-instances.c +59 -0
- zuvloop-0.0.1/vendor/libuv/test/test-pipe-sendmsg.c +172 -0
- zuvloop-0.0.1/vendor/libuv/test/test-pipe-server-close.c +94 -0
- zuvloop-0.0.1/vendor/libuv/test/test-pipe-set-fchmod.c +92 -0
- zuvloop-0.0.1/vendor/libuv/test/test-pipe-set-non-blocking.c +131 -0
- zuvloop-0.0.1/vendor/libuv/test/test-platform-output.c +259 -0
- zuvloop-0.0.1/vendor/libuv/test/test-poll-close-doesnt-corrupt-stack.c +114 -0
- zuvloop-0.0.1/vendor/libuv/test/test-poll-close.c +73 -0
- zuvloop-0.0.1/vendor/libuv/test/test-poll-closesocket.c +92 -0
- zuvloop-0.0.1/vendor/libuv/test/test-poll-multiple-handles.c +104 -0
- zuvloop-0.0.1/vendor/libuv/test/test-poll-oob.c +214 -0
- zuvloop-0.0.1/vendor/libuv/test/test-poll.c +730 -0
- zuvloop-0.0.1/vendor/libuv/test/test-process-priority.c +83 -0
- zuvloop-0.0.1/vendor/libuv/test/test-process-title-threadsafe.c +108 -0
- zuvloop-0.0.1/vendor/libuv/test/test-process-title.c +135 -0
- zuvloop-0.0.1/vendor/libuv/test/test-queue-foreach-delete.c +205 -0
- zuvloop-0.0.1/vendor/libuv/test/test-random.c +94 -0
- zuvloop-0.0.1/vendor/libuv/test/test-readable-on-eof.c +110 -0
- zuvloop-0.0.1/vendor/libuv/test/test-ref.c +445 -0
- zuvloop-0.0.1/vendor/libuv/test/test-run-nowait.c +46 -0
- zuvloop-0.0.1/vendor/libuv/test/test-run-once.c +48 -0
- zuvloop-0.0.1/vendor/libuv/test/test-semaphore.c +111 -0
- zuvloop-0.0.1/vendor/libuv/test/test-shutdown-close.c +108 -0
- zuvloop-0.0.1/vendor/libuv/test/test-shutdown-eof.c +188 -0
- zuvloop-0.0.1/vendor/libuv/test/test-shutdown-simultaneous.c +135 -0
- zuvloop-0.0.1/vendor/libuv/test/test-shutdown-twice.c +85 -0
- zuvloop-0.0.1/vendor/libuv/test/test-signal-multiple-loops.c +325 -0
- zuvloop-0.0.1/vendor/libuv/test/test-signal-pending-on-close.c +116 -0
- zuvloop-0.0.1/vendor/libuv/test/test-signal.c +325 -0
- zuvloop-0.0.1/vendor/libuv/test/test-socket-buffer-size.c +77 -0
- zuvloop-0.0.1/vendor/libuv/test/test-spawn.c +2112 -0
- zuvloop-0.0.1/vendor/libuv/test/test-stdio-over-pipes.c +299 -0
- zuvloop-0.0.1/vendor/libuv/test/test-strscpy.c +53 -0
- zuvloop-0.0.1/vendor/libuv/test/test-strtok.c +90 -0
- zuvloop-0.0.1/vendor/libuv/test/test-tcp-alloc-cb-fail.c +123 -0
- zuvloop-0.0.1/vendor/libuv/test/test-tcp-bind-error.c +317 -0
- zuvloop-0.0.1/vendor/libuv/test/test-tcp-bind6-error.c +176 -0
- zuvloop-0.0.1/vendor/libuv/test/test-tcp-close-accept.c +198 -0
- zuvloop-0.0.1/vendor/libuv/test/test-tcp-close-after-read-timeout.c +183 -0
- zuvloop-0.0.1/vendor/libuv/test/test-tcp-close-reset.c +340 -0
- zuvloop-0.0.1/vendor/libuv/test/test-tcp-close-while-connecting.c +97 -0
- zuvloop-0.0.1/vendor/libuv/test/test-tcp-close.c +136 -0
- zuvloop-0.0.1/vendor/libuv/test/test-tcp-connect-error-after-write.c +98 -0
- zuvloop-0.0.1/vendor/libuv/test/test-tcp-connect-error.c +73 -0
- zuvloop-0.0.1/vendor/libuv/test/test-tcp-connect-timeout.c +196 -0
- zuvloop-0.0.1/vendor/libuv/test/test-tcp-connect6-error.c +129 -0
- zuvloop-0.0.1/vendor/libuv/test/test-tcp-create-socket-early.c +213 -0
- zuvloop-0.0.1/vendor/libuv/test/test-tcp-flags.c +59 -0
- zuvloop-0.0.1/vendor/libuv/test/test-tcp-oob.c +146 -0
- zuvloop-0.0.1/vendor/libuv/test/test-tcp-open.c +407 -0
- zuvloop-0.0.1/vendor/libuv/test/test-tcp-read-stop-start.c +136 -0
- zuvloop-0.0.1/vendor/libuv/test/test-tcp-read-stop.c +76 -0
- zuvloop-0.0.1/vendor/libuv/test/test-tcp-reuseport.c +248 -0
- zuvloop-0.0.1/vendor/libuv/test/test-tcp-rst.c +110 -0
- zuvloop-0.0.1/vendor/libuv/test/test-tcp-shutdown-after-write.c +138 -0
- zuvloop-0.0.1/vendor/libuv/test/test-tcp-try-write-error.c +109 -0
- zuvloop-0.0.1/vendor/libuv/test/test-tcp-try-write.c +135 -0
- zuvloop-0.0.1/vendor/libuv/test/test-tcp-unexpected-read.c +117 -0
- zuvloop-0.0.1/vendor/libuv/test/test-tcp-write-after-connect.c +77 -0
- zuvloop-0.0.1/vendor/libuv/test/test-tcp-write-fail.c +115 -0
- zuvloop-0.0.1/vendor/libuv/test/test-tcp-write-in-a-row.c +143 -0
- zuvloop-0.0.1/vendor/libuv/test/test-tcp-write-queue-order.c +139 -0
- zuvloop-0.0.1/vendor/libuv/test/test-tcp-write-to-half-open-connection.c +141 -0
- zuvloop-0.0.1/vendor/libuv/test/test-tcp-writealot.c +185 -0
- zuvloop-0.0.1/vendor/libuv/test/test-test-macros.c +42 -0
- zuvloop-0.0.1/vendor/libuv/test/test-thread-affinity.c +154 -0
- zuvloop-0.0.1/vendor/libuv/test/test-thread-equal.c +51 -0
- zuvloop-0.0.1/vendor/libuv/test/test-thread-name.c +193 -0
- zuvloop-0.0.1/vendor/libuv/test/test-thread-priority.c +105 -0
- zuvloop-0.0.1/vendor/libuv/test/test-thread.c +306 -0
- zuvloop-0.0.1/vendor/libuv/test/test-threadpool-cancel.c +418 -0
- zuvloop-0.0.1/vendor/libuv/test/test-threadpool.c +76 -0
- zuvloop-0.0.1/vendor/libuv/test/test-timer-again.c +141 -0
- zuvloop-0.0.1/vendor/libuv/test/test-timer-from-check.c +80 -0
- zuvloop-0.0.1/vendor/libuv/test/test-timer.c +453 -0
- zuvloop-0.0.1/vendor/libuv/test/test-tmpdir.c +89 -0
- zuvloop-0.0.1/vendor/libuv/test/test-tty-duplicate-key.c +381 -0
- zuvloop-0.0.1/vendor/libuv/test/test-tty-escape-sequence-processing.c +1632 -0
- zuvloop-0.0.1/vendor/libuv/test/test-tty.c +468 -0
- zuvloop-0.0.1/vendor/libuv/test/test-udp-alloc-cb-fail.c +196 -0
- zuvloop-0.0.1/vendor/libuv/test/test-udp-bind.c +93 -0
- zuvloop-0.0.1/vendor/libuv/test/test-udp-connect.c +196 -0
- zuvloop-0.0.1/vendor/libuv/test/test-udp-connect6.c +199 -0
- zuvloop-0.0.1/vendor/libuv/test/test-udp-create-socket-early.c +139 -0
- zuvloop-0.0.1/vendor/libuv/test/test-udp-dgram-too-big.c +91 -0
- zuvloop-0.0.1/vendor/libuv/test/test-udp-ipv6.c +259 -0
- zuvloop-0.0.1/vendor/libuv/test/test-udp-mmsg.c +150 -0
- zuvloop-0.0.1/vendor/libuv/test/test-udp-multicast-interface.c +104 -0
- zuvloop-0.0.1/vendor/libuv/test/test-udp-multicast-interface6.c +108 -0
- zuvloop-0.0.1/vendor/libuv/test/test-udp-multicast-join.c +199 -0
- zuvloop-0.0.1/vendor/libuv/test/test-udp-multicast-join6.c +224 -0
- zuvloop-0.0.1/vendor/libuv/test/test-udp-multicast-ttl.c +94 -0
- zuvloop-0.0.1/vendor/libuv/test/test-udp-open.c +350 -0
- zuvloop-0.0.1/vendor/libuv/test/test-udp-options.c +160 -0
- zuvloop-0.0.1/vendor/libuv/test/test-udp-recv-in-a-row.c +128 -0
- zuvloop-0.0.1/vendor/libuv/test/test-udp-reuseport.c +287 -0
- zuvloop-0.0.1/vendor/libuv/test/test-udp-send-and-recv.c +212 -0
- zuvloop-0.0.1/vendor/libuv/test/test-udp-send-hang-loop.c +99 -0
- zuvloop-0.0.1/vendor/libuv/test/test-udp-send-immediate.c +148 -0
- zuvloop-0.0.1/vendor/libuv/test/test-udp-send-unreachable.c +201 -0
- zuvloop-0.0.1/vendor/libuv/test/test-udp-sendmmsg-error.c +75 -0
- zuvloop-0.0.1/vendor/libuv/test/test-udp-try-send.c +149 -0
- zuvloop-0.0.1/vendor/libuv/test/test-uname.c +69 -0
- zuvloop-0.0.1/vendor/libuv/test/test-walk-handles.c +77 -0
- zuvloop-0.0.1/vendor/libuv/test/test-watcher-cross-stop.c +112 -0
- zuvloop-0.0.1/vendor/libuv/tools/make_dist_html.py +122 -0
- zuvloop-0.0.1/vendor/libuv/tools/vswhere_usability_wrapper.cmd +33 -0
- zuvloop-0.0.1/vendor/libuv/tsansupp.txt +2 -0
- zuvloop-0.0.1/vendor/libuv/uv_win_longpath.manifest +8 -0
- zuvloop-0.0.1/vendor/update-libuv.sh +21 -0
- zuvloop-0.0.1/zig/addr.zig +107 -0
- zuvloop-0.0.1/zig/c.zig +4 -0
- zuvloop-0.0.1/zig/collections.zig +176 -0
- zuvloop-0.0.1/zig/datagram.zig +713 -0
- zuvloop-0.0.1/zig/dns.zig +416 -0
- zuvloop-0.0.1/zig/handle.zig +263 -0
- zuvloop-0.0.1/zig/loop.zig +1025 -0
- zuvloop-0.0.1/zig/module.zig +46 -0
- zuvloop-0.0.1/zig/poller.zig +169 -0
- zuvloop-0.0.1/zig/process.zig +334 -0
- zuvloop-0.0.1/zig/py.zig +293 -0
- zuvloop-0.0.1/zig/transport.zig +1255 -0
- zuvloop-0.0.1/zig/uv.zig +331 -0
- zuvloop-0.0.1/zuvloop/__init__.py +17 -0
- zuvloop-0.0.1/zuvloop/_base.py +383 -0
- zuvloop-0.0.1/zuvloop/_connect.py +850 -0
- zuvloop-0.0.1/zuvloop/_instrumentation.py +142 -0
- zuvloop-0.0.1/zuvloop/_loop.py +64 -0
- zuvloop-0.0.1/zuvloop/_process.py +134 -0
- zuvloop-0.0.1/zuvloop/_runner.py +18 -0
- zuvloop-0.0.1/zuvloop/_server.py +169 -0
- zuvloop-0.0.1/zuvloop/_sockets.py +149 -0
- zuvloop-0.0.1/zuvloop/_zuvloop.pyi +140 -0
- zuvloop-0.0.1/zuvloop/py.typed +0 -0
zuvloop-0.0.1/.gitignore
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
.zig-cache/
|
|
2
|
+
zig-out/
|
|
3
|
+
__pycache__/
|
|
4
|
+
*.py[cod]
|
|
5
|
+
*.so
|
|
6
|
+
.venv/
|
|
7
|
+
.coverage
|
|
8
|
+
.pytest_cache/
|
|
9
|
+
.mypy_cache/
|
|
10
|
+
.ruff_cache/
|
|
11
|
+
dist/
|
|
12
|
+
build/
|
|
13
|
+
tests/certs/
|
|
14
|
+
|
|
15
|
+
# Rendered documentation
|
|
16
|
+
site/
|
|
17
|
+
|
|
18
|
+
# CodSpeed run data
|
|
19
|
+
.codspeed/
|
|
20
|
+
|
|
21
|
+
# Compiled extension, built in place
|
|
22
|
+
zuvloop/*.so
|
|
23
|
+
zig-out/
|
|
24
|
+
.conformance/
|
zuvloop-0.0.1/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Marcelo Trylesinski
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
zuvloop-0.0.1/PKG-INFO
ADDED
|
@@ -0,0 +1,222 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: zuvloop
|
|
3
|
+
Version: 0.0.1
|
|
4
|
+
Summary: A libuv event loop for asyncio, written in Zig.
|
|
5
|
+
Project-URL: Source, https://github.com/Kludex/zuvloop
|
|
6
|
+
Author-email: Marcelo Trylesinski <marcelotryle@gmail.com>
|
|
7
|
+
License-Expression: MIT
|
|
8
|
+
License-File: LICENSE
|
|
9
|
+
License-File: vendor/libuv/LICENSE
|
|
10
|
+
License-File: vendor/libuv/LICENSE-docs
|
|
11
|
+
License-File: vendor/libuv/LICENSE-extra
|
|
12
|
+
Keywords: asyncio,event-loop,libuv,uvloop,zig
|
|
13
|
+
Classifier: Development Status :: 3 - Alpha
|
|
14
|
+
Classifier: Framework :: AsyncIO
|
|
15
|
+
Classifier: Intended Audience :: Developers
|
|
16
|
+
Classifier: Operating System :: MacOS
|
|
17
|
+
Classifier: Operating System :: POSIX :: Linux
|
|
18
|
+
Classifier: Programming Language :: Python :: 3.14
|
|
19
|
+
Classifier: Programming Language :: Zig
|
|
20
|
+
Classifier: Typing :: Typed
|
|
21
|
+
Requires-Python: >=3.14
|
|
22
|
+
Requires-Dist: opentelemetry-api>=1.23
|
|
23
|
+
Description-Content-Type: text/markdown
|
|
24
|
+
|
|
25
|
+
# zuvloop
|
|
26
|
+
|
|
27
|
+
<p align="center">
|
|
28
|
+
<em>A fast, drop-in asyncio event loop, powered by libuv and written in Zig ⚡</em>
|
|
29
|
+
</p>
|
|
30
|
+
|
|
31
|
+
---
|
|
32
|
+
|
|
33
|
+
**Documentation**: <a href="https://zuvloop.marcelotryle.com" target="_blank">https://zuvloop.marcelotryle.com</a>
|
|
34
|
+
|
|
35
|
+
**Source Code**: <a href="https://github.com/Kludex/zuvloop" target="_blank">https://github.com/Kludex/zuvloop</a>
|
|
36
|
+
|
|
37
|
+
---
|
|
38
|
+
|
|
39
|
+
zuvloop is a replacement for the built-in `asyncio` event loop.
|
|
40
|
+
|
|
41
|
+
Your code stays the same. The loop underneath gets faster. 🚀
|
|
42
|
+
|
|
43
|
+
The key features are:
|
|
44
|
+
|
|
45
|
+
- **Fast**: Scheduling, timers, sockets, and DNS run in native code, driven by [libuv](https://libuv.org) — the same engine behind Node.js. Up to **6x faster than asyncio** and faster than [uvloop](https://github.com/MagicStack/uvloop) on every benchmark below.
|
|
46
|
+
- **Drop-in**: One line to switch. Everything is standard `asyncio` — same `Task` objects, same protocols, same APIs.
|
|
47
|
+
- **Fully typed**: Ships type hints for everything and passes **strict mypy**. Your editor will love it. ✨
|
|
48
|
+
- **Observable**: Built-in [OpenTelemetry](https://opentelemetry.io) instrumentation — slow-callback spans, unhandled-exception spans, loop metrics. Zero cost until you turn it on.
|
|
49
|
+
- **Modern**: Built for Python 3.14, including the new asyncio introspection tools (`python -m asyncio ps`, call graphs, and friends).
|
|
50
|
+
|
|
51
|
+
## Performance
|
|
52
|
+
|
|
53
|
+
<p align="center">
|
|
54
|
+
<img src="docs/assets/performance.png" alt="zuvloop vs uvloop vs asyncio benchmarks">
|
|
55
|
+
</p>
|
|
56
|
+
|
|
57
|
+
Throughput relative to stock asyncio (higher is better), measured with the suite in
|
|
58
|
+
`benchmarks/` on an M3 Max, macOS 26, CPython 3.14. The labels show the absolute numbers.
|
|
59
|
+
|
|
60
|
+
| Benchmark | asyncio | uvloop | zuvloop |
|
|
61
|
+
| --- | ---: | ---: | ---: |
|
|
62
|
+
| `call_soon` | 2.69M/s | 4.69M/s | **5.91M/s** |
|
|
63
|
+
| `call_soon` with arguments | 2.43M/s | 3.87M/s | **6.47M/s** |
|
|
64
|
+
| timer schedule + cancel | 1.58M/s | 2.62M/s | **9.55M/s** |
|
|
65
|
+
| bulk stream | 8.4 GiB/s | 8.5 GiB/s | **10.2 GiB/s** |
|
|
66
|
+
| echo round trips, 1 KiB | 39.0k/s | 56.8k/s | **58.5k/s** |
|
|
67
|
+
| uvicorn, plaintext | 55.3k req/s | 71.9k req/s | **75.9k req/s** |
|
|
68
|
+
| uvicorn, 10 KiB body | 52.6k req/s | 68.7k req/s | **73.6k req/s** |
|
|
69
|
+
| aiohttp server | 49.0k req/s | 59.8k req/s | **60.6k req/s** |
|
|
70
|
+
| aiohttp client | 13.2k req/s | 16.2k req/s | **16.9k req/s** |
|
|
71
|
+
| `getaddrinfo`, numeric host | 28.5k/s | 1.57M/s | **1.90M/s** |
|
|
72
|
+
|
|
73
|
+
Curious how? The [architecture docs](https://zuvloop.marcelotryle.com) explain the design:
|
|
74
|
+
argument storage inside handles (no tuple per callback), a native timer heap behind a single
|
|
75
|
+
`uv_timer_t`, per-turn vectored write batching, zero-copy reads, and a `getaddrinfo` fast path
|
|
76
|
+
for address literals.
|
|
77
|
+
|
|
78
|
+
## Requirements
|
|
79
|
+
|
|
80
|
+
- Python 3.14+
|
|
81
|
+
- Linux or macOS
|
|
82
|
+
|
|
83
|
+
## Installation
|
|
84
|
+
|
|
85
|
+
```console
|
|
86
|
+
$ pip install zuvloop
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
To build from source you also need [Zig](https://ziglang.org/download/) 0.16.
|
|
90
|
+
|
|
91
|
+
## Example
|
|
92
|
+
|
|
93
|
+
Write normal asyncio code, run it with zuvloop:
|
|
94
|
+
|
|
95
|
+
```python
|
|
96
|
+
import asyncio
|
|
97
|
+
|
|
98
|
+
import zuvloop
|
|
99
|
+
|
|
100
|
+
|
|
101
|
+
async def main() -> None:
|
|
102
|
+
reader, writer = await asyncio.open_connection("example.com", 80)
|
|
103
|
+
writer.write(b"GET / HTTP/1.0\r\nHost: example.com\r\n\r\n")
|
|
104
|
+
await writer.drain()
|
|
105
|
+
print(await reader.read(64))
|
|
106
|
+
writer.close()
|
|
107
|
+
await writer.wait_closed()
|
|
108
|
+
|
|
109
|
+
|
|
110
|
+
zuvloop.run(main())
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
Prefer to keep `asyncio.run()`? Hand it the loop factory:
|
|
114
|
+
|
|
115
|
+
```python
|
|
116
|
+
asyncio.run(main(), loop_factory=zuvloop.new_event_loop)
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
That's it. That's the migration. 🎉
|
|
120
|
+
|
|
121
|
+
## Observability
|
|
122
|
+
|
|
123
|
+
zuvloop emits plain OpenTelemetry. The only runtime dependency is `opentelemetry-api` — not the
|
|
124
|
+
SDK, nothing vendor-specific. Until your application installs a provider, the instruments are
|
|
125
|
+
no-ops and cost nothing.
|
|
126
|
+
|
|
127
|
+
Anything that speaks OpenTelemetry can collect it. For example, with
|
|
128
|
+
<a href="https://logfire.pydantic.dev" target="_blank">Logfire</a>:
|
|
129
|
+
|
|
130
|
+
```python
|
|
131
|
+
import logfire
|
|
132
|
+
import zuvloop
|
|
133
|
+
|
|
134
|
+
logfire.configure() # installs the OTel providers
|
|
135
|
+
|
|
136
|
+
|
|
137
|
+
async def main() -> None: ...
|
|
138
|
+
|
|
139
|
+
|
|
140
|
+
zuvloop.run(main())
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
That's all — there is no zuvloop-specific setup. Spans and counters are emitted
|
|
144
|
+
as events happen, and the loop gauges are sampled automatically while the loop
|
|
145
|
+
runs (only when a real provider is installed, so an uninstrumented program never
|
|
146
|
+
pays for sampling).
|
|
147
|
+
|
|
148
|
+
You get:
|
|
149
|
+
|
|
150
|
+
- **`zuvloop.slow_callback`** spans — with real start/end timestamps measured by `uv_hrtime()`
|
|
151
|
+
in native code, and the awaiting call graph attached (via `asyncio.format_call_graph()`),
|
|
152
|
+
so you see *why* a callback was running, not just its repr.
|
|
153
|
+
- **`zuvloop.unhandled_exception`** spans — with the exception recorded.
|
|
154
|
+
- Counters, a callback-duration histogram, and live loop gauges (`loop_count`, `events`,
|
|
155
|
+
`idle_time_ns`, `ready`, `timers`, `watchers`, ...).
|
|
156
|
+
|
|
157
|
+
And because zuvloop schedules real `asyncio.Task` objects, the Python 3.14 introspection tools
|
|
158
|
+
work unchanged:
|
|
159
|
+
|
|
160
|
+
```console
|
|
161
|
+
$ python -m asyncio ps <pid>
|
|
162
|
+
$ python -m asyncio pstree <pid>
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
## Compatibility
|
|
166
|
+
|
|
167
|
+
zuvloop is checked against CPython's own conformance suite and against the test suites of the
|
|
168
|
+
projects that exercise an event loop hardest — run unmodified, with the loop swapped underneath:
|
|
169
|
+
|
|
170
|
+
| Suite | Result |
|
|
171
|
+
| --- | --- |
|
|
172
|
+
| CPython `test_asyncio` | 88 passed, 4 skipped, none failing |
|
|
173
|
+
| uvicorn | 1257 passed, no failures |
|
|
174
|
+
| aiohttp | 4473 passed, 36 failed — 33 of which also fail on stock asyncio |
|
|
175
|
+
|
|
176
|
+
`scripts/conformance.py` runs CPython's `EventLoopTestsMixin`, `SubprocessTestsMixin` and
|
|
177
|
+
`BaseSockTestsMixin` against zuvloop, downloading the source of whichever interpreter is running
|
|
178
|
+
so the suite always matches it. Each test runs in its own process, so a hang is reported rather
|
|
179
|
+
than stopping the run. Three of the four skips are white-box tests of CPython's own internals -
|
|
180
|
+
two patch `asyncio.base_events.socket`, one counts calls to `BaseEventLoop._run_once` - which no
|
|
181
|
+
loop outside the standard library can satisfy.
|
|
182
|
+
|
|
183
|
+
Of aiohttp's three remaining failures, two are `blockbuster` reporting a blocking `os.stat` that
|
|
184
|
+
the standard library makes on the same path, and the third is the `loop.time()` difference below.
|
|
185
|
+
|
|
186
|
+
(For reference: uvloop cannot complete the aiohttp suite — it fails fifteen tests and then hangs.)
|
|
187
|
+
|
|
188
|
+
There is one intentional difference: **patching `loop.time()` does not move the scheduler**.
|
|
189
|
+
zuvloop keeps its timer heap in native code and reads the clock directly, so monkeypatching
|
|
190
|
+
`time()` — a trick some test suites use to fast-forward timeouts — changes what `loop.time()`
|
|
191
|
+
returns and nothing else. A loop that needs a controllable clock should schedule against one
|
|
192
|
+
explicitly.
|
|
193
|
+
|
|
194
|
+
Also not implemented: `sendfile()` and `sock_sendfile()` raise `NotImplementedError`. Handles
|
|
195
|
+
returned by `call_soon` and `call_later` implement the `asyncio.Handle` and
|
|
196
|
+
`asyncio.TimerHandle` interfaces but are not instances of those classes; `call_soon_threadsafe`
|
|
197
|
+
does return a real `asyncio.Handle`, because 3.14 requires cancelling one from another thread to
|
|
198
|
+
block until a callback that has already started finishes.
|
|
199
|
+
|
|
200
|
+
## Development
|
|
201
|
+
|
|
202
|
+
```console
|
|
203
|
+
$ uv venv --python 3.14
|
|
204
|
+
$ uv pip install -e . --group dev
|
|
205
|
+
$ uv run pytest
|
|
206
|
+
$ uv run mypy
|
|
207
|
+
$ uv run ruff check
|
|
208
|
+
$ uv run --group bench python benchmarks/run.py
|
|
209
|
+
```
|
|
210
|
+
|
|
211
|
+
The extension is rebuilt by `hatch_build.py` on every install. To rebuild in place:
|
|
212
|
+
|
|
213
|
+
```console
|
|
214
|
+
$ python scripts/build.py
|
|
215
|
+
```
|
|
216
|
+
|
|
217
|
+
`vendor/libuv` is an unmodified upstream release tarball; see `vendor/README.md`. Update it with
|
|
218
|
+
`./vendor/update-libuv.sh <version>`.
|
|
219
|
+
|
|
220
|
+
## License
|
|
221
|
+
|
|
222
|
+
This project is licensed under the terms of the MIT license.
|
zuvloop-0.0.1/README.md
ADDED
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
# zuvloop
|
|
2
|
+
|
|
3
|
+
<p align="center">
|
|
4
|
+
<em>A fast, drop-in asyncio event loop, powered by libuv and written in Zig ⚡</em>
|
|
5
|
+
</p>
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
**Documentation**: <a href="https://zuvloop.marcelotryle.com" target="_blank">https://zuvloop.marcelotryle.com</a>
|
|
10
|
+
|
|
11
|
+
**Source Code**: <a href="https://github.com/Kludex/zuvloop" target="_blank">https://github.com/Kludex/zuvloop</a>
|
|
12
|
+
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
zuvloop is a replacement for the built-in `asyncio` event loop.
|
|
16
|
+
|
|
17
|
+
Your code stays the same. The loop underneath gets faster. 🚀
|
|
18
|
+
|
|
19
|
+
The key features are:
|
|
20
|
+
|
|
21
|
+
- **Fast**: Scheduling, timers, sockets, and DNS run in native code, driven by [libuv](https://libuv.org) — the same engine behind Node.js. Up to **6x faster than asyncio** and faster than [uvloop](https://github.com/MagicStack/uvloop) on every benchmark below.
|
|
22
|
+
- **Drop-in**: One line to switch. Everything is standard `asyncio` — same `Task` objects, same protocols, same APIs.
|
|
23
|
+
- **Fully typed**: Ships type hints for everything and passes **strict mypy**. Your editor will love it. ✨
|
|
24
|
+
- **Observable**: Built-in [OpenTelemetry](https://opentelemetry.io) instrumentation — slow-callback spans, unhandled-exception spans, loop metrics. Zero cost until you turn it on.
|
|
25
|
+
- **Modern**: Built for Python 3.14, including the new asyncio introspection tools (`python -m asyncio ps`, call graphs, and friends).
|
|
26
|
+
|
|
27
|
+
## Performance
|
|
28
|
+
|
|
29
|
+
<p align="center">
|
|
30
|
+
<img src="docs/assets/performance.png" alt="zuvloop vs uvloop vs asyncio benchmarks">
|
|
31
|
+
</p>
|
|
32
|
+
|
|
33
|
+
Throughput relative to stock asyncio (higher is better), measured with the suite in
|
|
34
|
+
`benchmarks/` on an M3 Max, macOS 26, CPython 3.14. The labels show the absolute numbers.
|
|
35
|
+
|
|
36
|
+
| Benchmark | asyncio | uvloop | zuvloop |
|
|
37
|
+
| --- | ---: | ---: | ---: |
|
|
38
|
+
| `call_soon` | 2.69M/s | 4.69M/s | **5.91M/s** |
|
|
39
|
+
| `call_soon` with arguments | 2.43M/s | 3.87M/s | **6.47M/s** |
|
|
40
|
+
| timer schedule + cancel | 1.58M/s | 2.62M/s | **9.55M/s** |
|
|
41
|
+
| bulk stream | 8.4 GiB/s | 8.5 GiB/s | **10.2 GiB/s** |
|
|
42
|
+
| echo round trips, 1 KiB | 39.0k/s | 56.8k/s | **58.5k/s** |
|
|
43
|
+
| uvicorn, plaintext | 55.3k req/s | 71.9k req/s | **75.9k req/s** |
|
|
44
|
+
| uvicorn, 10 KiB body | 52.6k req/s | 68.7k req/s | **73.6k req/s** |
|
|
45
|
+
| aiohttp server | 49.0k req/s | 59.8k req/s | **60.6k req/s** |
|
|
46
|
+
| aiohttp client | 13.2k req/s | 16.2k req/s | **16.9k req/s** |
|
|
47
|
+
| `getaddrinfo`, numeric host | 28.5k/s | 1.57M/s | **1.90M/s** |
|
|
48
|
+
|
|
49
|
+
Curious how? The [architecture docs](https://zuvloop.marcelotryle.com) explain the design:
|
|
50
|
+
argument storage inside handles (no tuple per callback), a native timer heap behind a single
|
|
51
|
+
`uv_timer_t`, per-turn vectored write batching, zero-copy reads, and a `getaddrinfo` fast path
|
|
52
|
+
for address literals.
|
|
53
|
+
|
|
54
|
+
## Requirements
|
|
55
|
+
|
|
56
|
+
- Python 3.14+
|
|
57
|
+
- Linux or macOS
|
|
58
|
+
|
|
59
|
+
## Installation
|
|
60
|
+
|
|
61
|
+
```console
|
|
62
|
+
$ pip install zuvloop
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
To build from source you also need [Zig](https://ziglang.org/download/) 0.16.
|
|
66
|
+
|
|
67
|
+
## Example
|
|
68
|
+
|
|
69
|
+
Write normal asyncio code, run it with zuvloop:
|
|
70
|
+
|
|
71
|
+
```python
|
|
72
|
+
import asyncio
|
|
73
|
+
|
|
74
|
+
import zuvloop
|
|
75
|
+
|
|
76
|
+
|
|
77
|
+
async def main() -> None:
|
|
78
|
+
reader, writer = await asyncio.open_connection("example.com", 80)
|
|
79
|
+
writer.write(b"GET / HTTP/1.0\r\nHost: example.com\r\n\r\n")
|
|
80
|
+
await writer.drain()
|
|
81
|
+
print(await reader.read(64))
|
|
82
|
+
writer.close()
|
|
83
|
+
await writer.wait_closed()
|
|
84
|
+
|
|
85
|
+
|
|
86
|
+
zuvloop.run(main())
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
Prefer to keep `asyncio.run()`? Hand it the loop factory:
|
|
90
|
+
|
|
91
|
+
```python
|
|
92
|
+
asyncio.run(main(), loop_factory=zuvloop.new_event_loop)
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
That's it. That's the migration. 🎉
|
|
96
|
+
|
|
97
|
+
## Observability
|
|
98
|
+
|
|
99
|
+
zuvloop emits plain OpenTelemetry. The only runtime dependency is `opentelemetry-api` — not the
|
|
100
|
+
SDK, nothing vendor-specific. Until your application installs a provider, the instruments are
|
|
101
|
+
no-ops and cost nothing.
|
|
102
|
+
|
|
103
|
+
Anything that speaks OpenTelemetry can collect it. For example, with
|
|
104
|
+
<a href="https://logfire.pydantic.dev" target="_blank">Logfire</a>:
|
|
105
|
+
|
|
106
|
+
```python
|
|
107
|
+
import logfire
|
|
108
|
+
import zuvloop
|
|
109
|
+
|
|
110
|
+
logfire.configure() # installs the OTel providers
|
|
111
|
+
|
|
112
|
+
|
|
113
|
+
async def main() -> None: ...
|
|
114
|
+
|
|
115
|
+
|
|
116
|
+
zuvloop.run(main())
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
That's all — there is no zuvloop-specific setup. Spans and counters are emitted
|
|
120
|
+
as events happen, and the loop gauges are sampled automatically while the loop
|
|
121
|
+
runs (only when a real provider is installed, so an uninstrumented program never
|
|
122
|
+
pays for sampling).
|
|
123
|
+
|
|
124
|
+
You get:
|
|
125
|
+
|
|
126
|
+
- **`zuvloop.slow_callback`** spans — with real start/end timestamps measured by `uv_hrtime()`
|
|
127
|
+
in native code, and the awaiting call graph attached (via `asyncio.format_call_graph()`),
|
|
128
|
+
so you see *why* a callback was running, not just its repr.
|
|
129
|
+
- **`zuvloop.unhandled_exception`** spans — with the exception recorded.
|
|
130
|
+
- Counters, a callback-duration histogram, and live loop gauges (`loop_count`, `events`,
|
|
131
|
+
`idle_time_ns`, `ready`, `timers`, `watchers`, ...).
|
|
132
|
+
|
|
133
|
+
And because zuvloop schedules real `asyncio.Task` objects, the Python 3.14 introspection tools
|
|
134
|
+
work unchanged:
|
|
135
|
+
|
|
136
|
+
```console
|
|
137
|
+
$ python -m asyncio ps <pid>
|
|
138
|
+
$ python -m asyncio pstree <pid>
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
## Compatibility
|
|
142
|
+
|
|
143
|
+
zuvloop is checked against CPython's own conformance suite and against the test suites of the
|
|
144
|
+
projects that exercise an event loop hardest — run unmodified, with the loop swapped underneath:
|
|
145
|
+
|
|
146
|
+
| Suite | Result |
|
|
147
|
+
| --- | --- |
|
|
148
|
+
| CPython `test_asyncio` | 88 passed, 4 skipped, none failing |
|
|
149
|
+
| uvicorn | 1257 passed, no failures |
|
|
150
|
+
| aiohttp | 4473 passed, 36 failed — 33 of which also fail on stock asyncio |
|
|
151
|
+
|
|
152
|
+
`scripts/conformance.py` runs CPython's `EventLoopTestsMixin`, `SubprocessTestsMixin` and
|
|
153
|
+
`BaseSockTestsMixin` against zuvloop, downloading the source of whichever interpreter is running
|
|
154
|
+
so the suite always matches it. Each test runs in its own process, so a hang is reported rather
|
|
155
|
+
than stopping the run. Three of the four skips are white-box tests of CPython's own internals -
|
|
156
|
+
two patch `asyncio.base_events.socket`, one counts calls to `BaseEventLoop._run_once` - which no
|
|
157
|
+
loop outside the standard library can satisfy.
|
|
158
|
+
|
|
159
|
+
Of aiohttp's three remaining failures, two are `blockbuster` reporting a blocking `os.stat` that
|
|
160
|
+
the standard library makes on the same path, and the third is the `loop.time()` difference below.
|
|
161
|
+
|
|
162
|
+
(For reference: uvloop cannot complete the aiohttp suite — it fails fifteen tests and then hangs.)
|
|
163
|
+
|
|
164
|
+
There is one intentional difference: **patching `loop.time()` does not move the scheduler**.
|
|
165
|
+
zuvloop keeps its timer heap in native code and reads the clock directly, so monkeypatching
|
|
166
|
+
`time()` — a trick some test suites use to fast-forward timeouts — changes what `loop.time()`
|
|
167
|
+
returns and nothing else. A loop that needs a controllable clock should schedule against one
|
|
168
|
+
explicitly.
|
|
169
|
+
|
|
170
|
+
Also not implemented: `sendfile()` and `sock_sendfile()` raise `NotImplementedError`. Handles
|
|
171
|
+
returned by `call_soon` and `call_later` implement the `asyncio.Handle` and
|
|
172
|
+
`asyncio.TimerHandle` interfaces but are not instances of those classes; `call_soon_threadsafe`
|
|
173
|
+
does return a real `asyncio.Handle`, because 3.14 requires cancelling one from another thread to
|
|
174
|
+
block until a callback that has already started finishes.
|
|
175
|
+
|
|
176
|
+
## Development
|
|
177
|
+
|
|
178
|
+
```console
|
|
179
|
+
$ uv venv --python 3.14
|
|
180
|
+
$ uv pip install -e . --group dev
|
|
181
|
+
$ uv run pytest
|
|
182
|
+
$ uv run mypy
|
|
183
|
+
$ uv run ruff check
|
|
184
|
+
$ uv run --group bench python benchmarks/run.py
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
The extension is rebuilt by `hatch_build.py` on every install. To rebuild in place:
|
|
188
|
+
|
|
189
|
+
```console
|
|
190
|
+
$ python scripts/build.py
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
`vendor/libuv` is an unmodified upstream release tarball; see `vendor/README.md`. Update it with
|
|
194
|
+
`./vendor/update-libuv.sh <version>`.
|
|
195
|
+
|
|
196
|
+
## License
|
|
197
|
+
|
|
198
|
+
This project is licensed under the terms of the MIT license.
|
zuvloop-0.0.1/build.zig
ADDED
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
const std = @import("std");
|
|
2
|
+
|
|
3
|
+
const uv_common = [_][]const u8{
|
|
4
|
+
"src/fs-poll.c",
|
|
5
|
+
"src/idna.c",
|
|
6
|
+
"src/inet.c",
|
|
7
|
+
"src/random.c",
|
|
8
|
+
"src/strscpy.c",
|
|
9
|
+
"src/strtok.c",
|
|
10
|
+
"src/thread-common.c",
|
|
11
|
+
"src/threadpool.c",
|
|
12
|
+
"src/timer.c",
|
|
13
|
+
"src/uv-common.c",
|
|
14
|
+
"src/uv-data-getter-setters.c",
|
|
15
|
+
"src/version.c",
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
const uv_unix = [_][]const u8{
|
|
19
|
+
"src/unix/async.c",
|
|
20
|
+
"src/unix/core.c",
|
|
21
|
+
"src/unix/dl.c",
|
|
22
|
+
"src/unix/fs.c",
|
|
23
|
+
"src/unix/getaddrinfo.c",
|
|
24
|
+
"src/unix/getnameinfo.c",
|
|
25
|
+
"src/unix/loop-watcher.c",
|
|
26
|
+
"src/unix/loop.c",
|
|
27
|
+
"src/unix/pipe.c",
|
|
28
|
+
"src/unix/poll.c",
|
|
29
|
+
"src/unix/process.c",
|
|
30
|
+
"src/unix/random-devurandom.c",
|
|
31
|
+
"src/unix/signal.c",
|
|
32
|
+
"src/unix/stream.c",
|
|
33
|
+
"src/unix/tcp.c",
|
|
34
|
+
"src/unix/thread.c",
|
|
35
|
+
"src/unix/tty.c",
|
|
36
|
+
"src/unix/udp.c",
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
const uv_darwin = [_][]const u8{
|
|
40
|
+
"src/unix/bsd-ifaddrs.c",
|
|
41
|
+
"src/unix/darwin-proctitle.c",
|
|
42
|
+
"src/unix/darwin.c",
|
|
43
|
+
"src/unix/fsevents.c",
|
|
44
|
+
"src/unix/kqueue.c",
|
|
45
|
+
"src/unix/proctitle.c",
|
|
46
|
+
"src/unix/random-getentropy.c",
|
|
47
|
+
};
|
|
48
|
+
|
|
49
|
+
const uv_linux = [_][]const u8{
|
|
50
|
+
"src/unix/linux.c",
|
|
51
|
+
"src/unix/procfs-exepath.c",
|
|
52
|
+
"src/unix/proctitle.c",
|
|
53
|
+
"src/unix/random-getrandom.c",
|
|
54
|
+
"src/unix/random-sysctl-linux.c",
|
|
55
|
+
};
|
|
56
|
+
|
|
57
|
+
pub fn build(b: *std.Build) void {
|
|
58
|
+
const target = b.standardTargetOptions(.{});
|
|
59
|
+
const optimize = b.standardOptimizeOption(.{});
|
|
60
|
+
|
|
61
|
+
// hatch-ziglang passes the building interpreter through the environment, so a
|
|
62
|
+
// wheel is always built against the interpreter that asked for it. The `-D`
|
|
63
|
+
// options are for building by hand.
|
|
64
|
+
const python_include = b.option([]const u8, "python-include", "CPython include directory") orelse
|
|
65
|
+
(b.graph.environ_map.get("HATCH_ZIG_PYTHON_INCLUDE") orelse
|
|
66
|
+
@panic("python-include is required: pass -Dpython-include or set HATCH_ZIG_PYTHON_INCLUDE"));
|
|
67
|
+
const ext_suffix = b.option([]const u8, "ext-suffix", "Extension module suffix") orelse
|
|
68
|
+
(b.graph.environ_map.get("HATCH_ZIG_EXT_SUFFIX") orelse ".so");
|
|
69
|
+
const os = target.result.os.tag;
|
|
70
|
+
|
|
71
|
+
const mod = b.createModule(.{
|
|
72
|
+
.root_source_file = b.path("zig/module.zig"),
|
|
73
|
+
.target = target,
|
|
74
|
+
.optimize = optimize,
|
|
75
|
+
.link_libc = true,
|
|
76
|
+
.pic = true,
|
|
77
|
+
});
|
|
78
|
+
mod.addIncludePath(.{ .cwd_relative = python_include });
|
|
79
|
+
mod.addIncludePath(b.path("vendor/libuv/include"));
|
|
80
|
+
mod.addIncludePath(b.path("vendor/libuv/src"));
|
|
81
|
+
|
|
82
|
+
var uv_flags: std.ArrayList([]const u8) = .empty;
|
|
83
|
+
uv_flags.appendSlice(b.allocator, &.{
|
|
84
|
+
"-std=gnu11",
|
|
85
|
+
"-fno-strict-aliasing",
|
|
86
|
+
"-D_FILE_OFFSET_BITS=64",
|
|
87
|
+
"-D_LARGEFILE_SOURCE",
|
|
88
|
+
"-Wno-unused-parameter",
|
|
89
|
+
}) catch @panic("OOM");
|
|
90
|
+
|
|
91
|
+
var uv_files: std.ArrayList([]const u8) = .empty;
|
|
92
|
+
uv_files.appendSlice(b.allocator, &uv_common) catch @panic("OOM");
|
|
93
|
+
uv_files.appendSlice(b.allocator, &uv_unix) catch @panic("OOM");
|
|
94
|
+
switch (os) {
|
|
95
|
+
.macos, .ios, .watchos, .tvos => {
|
|
96
|
+
uv_files.appendSlice(b.allocator, &uv_darwin) catch @panic("OOM");
|
|
97
|
+
uv_flags.appendSlice(b.allocator, &.{
|
|
98
|
+
"-D_DARWIN_UNLIMITED_SELECT=1",
|
|
99
|
+
"-D_DARWIN_USE_64_BIT_INODE=1",
|
|
100
|
+
}) catch @panic("OOM");
|
|
101
|
+
},
|
|
102
|
+
.linux => {
|
|
103
|
+
uv_files.appendSlice(b.allocator, &uv_linux) catch @panic("OOM");
|
|
104
|
+
uv_flags.appendSlice(b.allocator, &.{
|
|
105
|
+
"-D_GNU_SOURCE",
|
|
106
|
+
"-D_POSIX_C_SOURCE=200112",
|
|
107
|
+
}) catch @panic("OOM");
|
|
108
|
+
},
|
|
109
|
+
else => @panic("unsupported target: zuvloop builds on Linux and macOS"),
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
mod.addCSourceFiles(.{
|
|
113
|
+
.root = b.path("vendor/libuv"),
|
|
114
|
+
.files = uv_files.items,
|
|
115
|
+
.flags = uv_flags.items,
|
|
116
|
+
});
|
|
117
|
+
|
|
118
|
+
const lib = b.addLibrary(.{
|
|
119
|
+
.name = "_zuvloop",
|
|
120
|
+
.root_module = mod,
|
|
121
|
+
.linkage = .dynamic,
|
|
122
|
+
});
|
|
123
|
+
lib.linker_allow_shlib_undefined = true;
|
|
124
|
+
lib.bundle_compiler_rt = true;
|
|
125
|
+
if (os == .linux) mod.linkSystemLibrary("rt", .{});
|
|
126
|
+
|
|
127
|
+
// Relative to the install prefix, so with the default `zig-out` the module
|
|
128
|
+
// lands beside the Python sources, which is where the build hook looks.
|
|
129
|
+
b.getInstallStep().dependOn(&b.addInstallFileWithDir(
|
|
130
|
+
lib.getEmittedBin(),
|
|
131
|
+
.{ .custom = "../zuvloop" },
|
|
132
|
+
b.fmt("_zuvloop{s}", .{ext_suffix}),
|
|
133
|
+
).step);
|
|
134
|
+
}
|