8616f13a71
CL/6867 added support for builtins.import, which required a cyclic reference import->globals->builtins->import. This was implemented using a RefCell, which makes it possible to mutate the builtins during evaluation. The commit message for CL/6867 expressed a desire to eliminate this possibility: This opens up a potentially dangerous footgun in which we could mutate the builtins at runtime leading to different compiler invocations seeing different builtins, so it'd be nice to have some kind of "finalised" status for them or some such, but I'm not sure how to represent that atm. This CL replaces the RefCell with Rc::new_cyclic(), making the globals/builtins immutable once again. At VM runtime (once opcodes start executing) everything is the same as before this CL, except that the Rc<RefCell<>> introduced by CL/6867 is turned into an rc::Weak<>. The function passed to Rc::new_cyclic works very similarly to overlays in nixpkgs: a function takes its own result as an argument. However instead of laziness "breaking the cycle", Rust's Rc::new_cyclic() instead uses an rc::Weak. This is done to prevent memory leaks rather than divergence. This CL also resolves the following TODO from CL/6867: // TODO: encapsulate this import weirdness in builtins The main disadvantage of this CL is the fact that the VM now must ensure that it holds a strong reference to the globals while a program is executing; failure to do so will cause a panic when the weak reference in the builtins is upgrade()d. In theory it should be possible to create strong reference cycles the same way Rc::new_cyclic() creates weak cycles, but these cycles would cause a permanent memory leak -- without either an rc::Weak or RefCell there is no way to break the cycle. At some point we will have to implement some form of cycle collection; whatever library we choose for that purpose is likely to provide an "immutable strong reference cycle" primitive similar to Rc::new_cyclic(), and we should be able to simply drop it in. Signed-off-by: Adam Joseph <adam@westernsemico.com> Change-Id: I34bb5821628eb97e426bdb880b02e2097402adb7 Reviewed-on: https://cl.tvl.fyi/c/depot/+/7097 Tested-by: BuildkiteCI Reviewed-by: tazjin <tazjin@tvl.su> |
||
---|---|---|
.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.