1e80b9ea8b
Given Rust's current lack of support for tail calls, we cannot avoid using `async` for builtins. This is the only way to avoid overflowing the cpu stack when we have arbitrarily deep builtin/interpreted/builtin/interpreted/... "sandwiches" There are only five `async fn` functions which are not builtins (some come in multiple "flavors"): - add_values - resolve_with - force, final_deep_force - nix_eq, nix_cmp_eq - coerce_to_string These can be written iteratively rather than recursively (and in fact nix_eq used to be written that way!). I volunteer to rewrite them. If written iteratively they would no longer need to be `async`. There are two motivations for limiting our reliance on `async` to only the situation (builtins) where we have no other choice: 1. Performance. We don't really have any good measurement of the performance hit that the Box<dyn Future>s impose on us. Right now all of our large (nixpkgs-eval) tests are swamped by the cost of other things (e.g. fork()ing `nix-store`) so we can't really measure it. Builtins tend to be expensive operations anyways (regexp-matching, sorting, etc) that are likely to already cost more than the `async` overhead. 2. Preserving the ability to switch to `musttail` calls. Clang/LLVM recently got `musttail` (mandatory-elimination tail calls). Rust has refused to add this mainly because WASM doesn't support, but WASM `tail_call` has been implemented and was recently moved to phase 4 (standardization). It is very likely that Rust will get tail calls sometime in the next year; if it does, we won't need async anymore. In the meantime, I'd like to avoid adding any further reliance on `async` in places where it wouldn't be straightforward to replace it with a tail call. https://reviews.llvm.org/D99517 https://github.com/WebAssembly/proposals/pull/157 https: //github.com/rust-lang/rfcs/issues/2691#issuecomment-1462152908 Change-Id: Id15945d5a92bf52c16d93456e3437f91d93bdc57 Reviewed-on: https://cl.tvl.fyi/c/depot/+/8290 Reviewed-by: tazjin <tazjin@tvl.su> Tested-by: BuildkiteCI Autosubmit: Adam Joseph <adam@westernsemico.com> |
||
---|---|---|
.gcroots | ||
.nixery | ||
corp | ||
docs | ||
fun | ||
lisp | ||
net | ||
nix | ||
ops | ||
third_party | ||
tools | ||
tvix | ||
users | ||
views | ||
web | ||
.envrc | ||
.git-blame-ignore-revs | ||
.gitignore | ||
.hgignore | ||
.mailmap | ||
.rgignore | ||
buf.gen.yaml | ||
buf.yaml | ||
default.nix | ||
LICENSE | ||
OWNERS | ||
README.md | ||
RULES | ||
rustfmt.toml |
depot
This repository is the monorepo for the community around The Virus Lounge, containing our personal tools and infrastructure. Everything in here is built using Nix.
A large portion of the software here is very self-referential, meaning that it exists to sustain the operation of the repository. This is the case because we partially see this as an experiment in tooling for monorepos.
Highlights
Services
-
Source code is available primarily through Sourcegraph on cs.tvl.fyi, where it is searchable and even semantically indexed. A lower-tech view of the repository is also available via cgit-pink on code.tvl.fyi.
The repository can be cloned using
git
fromhttps://cl.tvl.fyi/depot
. -
All code in the depot, with the exception of code that is checked in to individual
//users
folders, needs to be reviewed. We use Gerrit on cl.tvl.fyi for this. -
Issues are tracked via our own issue tracker on b.tvl.fyi. Its source code lives at
//web/panettone/
. -
Smaller todo-list entries which do not warrant a separate issue are listed at todo.tvl.fyi.
-
We use Buildkite for CI. Recent builds are listed on tvl.fyi/builds and pipelines are configured dynamically via
//ops/pipelines
. -
A search service that makes TVL services available via textual shortcuts is available: atward
All services that we host are deployed on NixOS machines that we manage. Their
configuration is tracked in //ops/{modules,machines}
.
Nix
//nix/readTree
contains the Nix code which automatically registers projects in our Nix attribute hierarchy based on their in-tree location//tools/nixery
contains the source code of Nixery, a container registry that can build images ad-hoc from Nix packages//nix/yants
contains Yet Another Nix Type System, which we use for a variety of things throughout the repository//nix/buildGo
implements a Nix library that can build Go software in the style of Bazel'srules_go
. Go programs in this repository are built using this library.//nix/buildLisp
implements a Nix library that can build Common Lisp software. Currently only SBCL is supported. Lisp programs in this repository are built using this library.//web/blog
and//web/atom-feed
: A Nix-based static site generator which generates the web page and Atom feed for tazj.in (//users/tazjin/homepage
) and tvl.fyi (//web/tvl
)//web/bubblegum
contains a CGI-based web framework written in Nix.//nix/nint
: A shebang-compatible interpreter wrapper for Nix.//tvix
contains initial work towards a modular architecture for Nix.
We have a variety of other tools and libraries in the //nix
folder which may
be of interest.
Packages / Libraries
//net/alcoholic_jwt
contains an easy-to-use JWT-validation library for Rust//net/crimp
contains a high-level HTTP client using cURL for Rust//tools/emacs-pkgs
contains various useful Emacs libraries, for example:dottime.el
provides dottime in the Emacs modelinenix-util.el
provides editing utilities for Nix filesterm-switcher.el
is an ivy-function for switching between vterm bufferstvl.el
provides helper functions for interacting with the TVL monorepo
//lisp/klatre
provides a grab-bag utility library for Common Lisp
User packages
Contributors to the repository have user directories under
//users
, which can be used for
personal or experimental code that does not require review.
Some examples:
//users/grfn/xanthous
: A (WIP) TUI RPG, written in Haskell.//users/tazjin/emacs
: tazjin's Emacs & EXWM configuration//users/tazjin/finito
: A persistent finite-state machine library for Rust.
Licensing
Unless otherwise stated in a subdirectory, all code is licensed under the MIT license. See LICENSE for details.
Contributing
If you'd like to contribute to any of the tools in here, please check out the contribution guidelines and our code of conduct.
IRC users can find us in #tvl
on hackint, which is also
reachable via XMPP at #tvl@irc.hackint.org
(sic!).
Hackint also provide a web chat.