diff options
author | Artemis Tosini <me@artem.ist> | 2024-03-29 20:29:44 -0400 |
---|---|---|
committer | Artemis Tosini <lix@artem.ist> | 2024-04-25 23:24:21 -0400 |
commit | c03de0df627864fb7e83e9af88201b8a5fcd4930 (patch) | |
tree | 39b4b783a896199d736022422b29bf1be05b304f /tests/functional/gc-runtime.sh | |
parent | 5420b3afd6c328faf1508dce03bbe8e58da8af2b (diff) |
gc: Find roots using libproc on Darwin
Previously, the garbage collector found runtime roots on Darwin by
shelling out to `lsof -n -w -F n` then parsing the result.
However, this requires an lsof binary and can be extremely slow.
The official Apple lsof returns in a reasonable amount of time,
about 250ms in my tests, but the lsof packaged in nixpkgs is quite slow,
taking about 40 seconds to run the command.
Using libproc directly is about the same speed as Apple lsof,
and allows us to reënable several tests that were disabled on Darwin.
Change-Id: Ifa0adda7984e13c15535693baba835aae79a3577
Diffstat (limited to 'tests/functional/gc-runtime.sh')
-rw-r--r-- | tests/functional/gc-runtime.sh | 32 |
1 files changed, 19 insertions, 13 deletions
diff --git a/tests/functional/gc-runtime.sh b/tests/functional/gc-runtime.sh index dc1826a55..6e17acfc0 100644 --- a/tests/functional/gc-runtime.sh +++ b/tests/functional/gc-runtime.sh @@ -1,38 +1,44 @@ source common.sh -case $system in - *linux*) - ;; - *) - skipTest "Not running Linux"; -esac - set -m # enable job control, needed for kill profiles="$NIX_STATE_DIR"/profiles rm -rf $profiles -nix-env -p $profiles/test -f ./gc-runtime.nix -i gc-runtime +nix-env -p $profiles/test -f ./gc-runtime.nix -i gc-runtime-{program,environ,open} -outPath=$(nix-env -p $profiles/test -q --no-name --out-path gc-runtime) -echo $outPath +programPath=$(nix-env -p $profiles/test -q --no-name --out-path gc-runtime-program) +environPath=$(nix-env -p $profiles/test -q --no-name --out-path gc-runtime-environ) +openPath=$(nix-env -p $profiles/test -q --no-name --out-path gc-runtime-open) +echo $programPath $environPath $openPath echo "backgrounding program..." -$profiles/test/program & +export environPath +$profiles/test/program $openPath/open & sleep 2 # hack - wait for the program to get started child=$! echo PID=$child -nix-env -p $profiles/test -e gc-runtime +nix-env -p $profiles/test -e gc-runtime-{program,environ,open} nix-env -p $profiles/test --delete-generations old nix-store --gc kill -- -$child -if ! test -e $outPath; then +if ! test -e $programPath; then echo "running program was garbage collected!" exit 1 fi +if ! test -e $environPath; then + echo "file in environment variable was garbage collected!" + exit 1 +fi + +if ! test -e $openPath; then + echo "opened file was garbage collected!" + exit 1 +fi + exit 0 |