Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
72 changes: 71 additions & 1 deletion majit/majit-gc/src/collector.rs
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
use indexmap::IndexSet;
use majit_ir::GcRef;
use std::collections::VecDeque;
use std::sync::RwLock;
use std::sync::atomic::{AtomicUsize, Ordering};

use crate::address_dict::AddressMap;
Expand Down Expand Up @@ -83,6 +84,52 @@ pub struct GcConfig {
pub taggedpointers: bool,
}

/// The variables [`GcConfig`] and [`MiniMarkGC::with_config`] resolve against,
/// for an embedder that has to hand its environment over rather than share it.
///
/// Published here so such a host does not keep its own copy of the list in step
/// with the collector; `PYPY_GC_DEBUG` and the tracing knobs are absent because
/// nothing in this file reads them.
pub const GC_ENV_NAMES: &[&str] = &[
"PYPY_GC_NURSERY",
"PYPY_GC_INCREMENT_STEP",
"PYPY_GC_MAJOR_COLLECT",
"PYPY_GC_GROWTH",
"PYPY_GC_MIN",
"PYPY_GC_MAX",
"PYPY_GC_MAX_DELTA",
];

/// Environment an embedder supplies because the platform gives the process
/// none. Read only where `std::env` misses, so a host that has a real
/// environment resolves against it exactly as before.
///
/// `wasm32-unknown-unknown` is the case that needs it: `std::env::var` there
/// always fails, so every name in [`GC_ENV_NAMES`] reads as unset and a guest
/// runs the built-in defaults no matter what its host was configured with. The
/// interpreter's launcher options have the same problem and the same answer
/// (`pyre-wasm`'s `LAUNCH_ENV`).
static SUPPLIED_ENV: RwLock<Vec<(String, String)>> = RwLock::new(Vec::new());

/// Install the environment [`GC_ENV_NAMES`] resolves against when the process
/// has none. Call before the first allocation: the values are read once, when
/// the collector is built.
pub fn set_supplied_env(entries: Vec<(String, String)>) {
*SUPPLIED_ENV.write().unwrap() = entries;
}

/// `std::env::var`, falling back to what the embedder supplied.
fn env_var(varname: &str) -> Option<String> {
if let Ok(value) = std::env::var(varname) {
return Some(value);
}
let supplied = SUPPLIED_ENV.read().unwrap();
supplied
.iter()
.find(|(name, _)| name == varname)
.map(|(_, value)| value.clone())
}

/// env.py:17-36 `_read_float_and_factor_from_env`. Parse `varname` as a float
/// with an optional `k`/`m`/`g` size suffix (optionally followed by `b`/`B`),
/// returning `(value, factor)`. `None` mirrors PyPy's `(0.0, 0)` absent /
Expand All @@ -91,7 +138,7 @@ pub struct GcConfig {
/// non-finite handling happens at the `int`/`r_uint` conversion sites, as
/// upstream where `int(inf)`/`r_uint(inf)` raise.
fn read_float_and_factor_from_env(varname: &str) -> Option<(f64, f64)> {
let raw = std::env::var(varname).ok()?;
let raw = env_var(varname)?;
let mut value = raw.trim();
if value.is_empty() {
return None;
Expand Down Expand Up @@ -5338,6 +5385,29 @@ mod tests {

static SHADOW_STACK_TEST_LOCK: std::sync::Mutex<()> = std::sync::Mutex::new(());

/// A supplied environment answers a name the process does not define, and
/// yields to one it does. The name is not in [`GC_ENV_NAMES`], so a
/// concurrently built collector cannot see this table.
#[test]
fn supplied_env_fills_in_only_what_the_process_lacks() {
let absent = "PYRE_TEST_SUPPLIED_ENV_ABSENT";
let present = "PYRE_TEST_SUPPLIED_ENV_PRESENT";
// SAFETY: single-threaded within this test; the names are unique to it.
unsafe { std::env::set_var(present, "2m") };

assert_eq!(read_uint_from_env(absent), None);
set_supplied_env(vec![
(absent.to_string(), "1m".to_string()),
(present.to_string(), "4m".to_string()),
]);
assert_eq!(read_uint_from_env(absent), Some(1024 * 1024));
assert_eq!(read_uint_from_env(present), Some(2 * 1024 * 1024));

set_supplied_env(Vec::new());
assert_eq!(read_uint_from_env(absent), None);
unsafe { std::env::remove_var(present) };
}

/// Helper: create a GC with a small nursery for testing.
fn test_gc(nursery_size: usize) -> MiniMarkGC {
MiniMarkGC::with_config(GcConfig {
Expand Down
2 changes: 1 addition & 1 deletion pyre/bench/synth/arith_int_bool.wasm.jitstats
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ descr_set_absent=0
descr_set_ambiguous=0
descr_set_stale_absent=0
fbw_rolled_back_with_effects=0
guard_failures=2214
guard_failures=2211
internal_compile_panics=0
loops_aborted=0
loops_compiled=7
2 changes: 1 addition & 1 deletion pyre/bench/synth/binary_slice_index.wasm.jitstats
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ descr_set_absent=0
descr_set_ambiguous=0
descr_set_stale_absent=0
fbw_rolled_back_with_effects=0
guard_failures=4
guard_failures=2
internal_compile_panics=0
loops_aborted=0
loops_compiled=3
2 changes: 1 addition & 1 deletion pyre/bench/synth/bool_dunder_error_no_leak.wasm.jitstats
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ descr_set_absent=0
descr_set_ambiguous=0
descr_set_stale_absent=0
fbw_rolled_back_with_effects=0
guard_failures=2
guard_failures=1
internal_compile_panics=0
loops_aborted=0
loops_compiled=2
2 changes: 1 addition & 1 deletion pyre/bench/synth/build_set_hashability.wasm.jitstats
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ descr_set_absent=0
descr_set_ambiguous=0
descr_set_stale_absent=0
fbw_rolled_back_with_effects=0
guard_failures=2
guard_failures=1
internal_compile_panics=0
loops_aborted=0
loops_compiled=2
2 changes: 1 addition & 1 deletion pyre/bench/synth/closure_per_call.wasm.jitstats
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ descr_set_stale_absent=0
fbw_rolled_back_with_effects=0
field_pos_attached_misplaced=0
field_pos_spec_misplaced=0
guard_failures=468
guard_failures=420
internal_compile_panics=0
loops_aborted=0
loops_compiled=4
2 changes: 1 addition & 1 deletion pyre/bench/synth/dict_set.wasm.jitstats
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ descr_set_absent=0
descr_set_ambiguous=0
descr_set_stale_absent=0
fbw_rolled_back_with_effects=0
guard_failures=609
guard_failures=606
internal_compile_panics=0
loops_aborted=0
loops_compiled=5
2 changes: 1 addition & 1 deletion pyre/bench/synth/divmod_long_int_pair.wasm.jitstats
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ descr_set_absent=0
descr_set_ambiguous=0
descr_set_stale_absent=0
fbw_rolled_back_with_effects=0
guard_failures=9
guard_failures=4
internal_compile_panics=0
loops_aborted=0
loops_compiled=4
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ descr_set_absent=0
descr_set_ambiguous=0
descr_set_stale_absent=0
fbw_rolled_back_with_effects=0
guard_failures=613
guard_failures=611
internal_compile_panics=0
loops_aborted=0
loops_compiled=2
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
bridges_compiled=5
bridges_compiled=4
descr_set_absent=0
descr_set_ambiguous=0
descr_set_stale_absent=0
fbw_rolled_back_with_effects=0
guard_failures=1016
guard_failures=814
internal_compile_panics=0
loops_aborted=0
loops_compiled=15
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
bridges_compiled=5
bridges_compiled=4
descr_set_absent=0
descr_set_ambiguous=0
descr_set_stale_absent=0
fbw_rolled_back_with_effects=0
guard_failures=1008
guard_failures=807
internal_compile_panics=0
loops_aborted=0
loops_compiled=6
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ descr_set_absent=0
descr_set_ambiguous=0
descr_set_stale_absent=0
fbw_rolled_back_with_effects=0
guard_failures=2
guard_failures=1
internal_compile_panics=0
loops_aborted=0
loops_compiled=1
2 changes: 1 addition & 1 deletion pyre/bench/synth/exception_oserror_fields.wasm.jitstats
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ descr_set_absent=0
descr_set_ambiguous=0
descr_set_stale_absent=0
fbw_rolled_back_with_effects=0
guard_failures=202
guard_failures=201
internal_compile_panics=0
loops_aborted=0
loops_compiled=1
2 changes: 1 addition & 1 deletion pyre/bench/synth/exception_subclass_attrs.wasm.jitstats
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ descr_set_absent=0
descr_set_ambiguous=0
descr_set_stale_absent=0
fbw_rolled_back_with_effects=0
guard_failures=3
guard_failures=1
internal_compile_panics=0
loops_aborted=0
loops_compiled=1
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ descr_set_stale_absent=0
fbw_rolled_back_with_effects=0
field_pos_attached_misplaced=0
field_pos_spec_misplaced=0
guard_failures=819
guard_failures=817
internal_compile_panics=0
loops_aborted=0
loops_compiled=17
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ descr_set_absent=0
descr_set_ambiguous=0
descr_set_stale_absent=0
fbw_rolled_back_with_effects=0
guard_failures=822
guard_failures=811
internal_compile_panics=0
loops_aborted=0
loops_compiled=8
2 changes: 1 addition & 1 deletion pyre/bench/synth/exception_value_op_caught.wasm.jitstats
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ descr_set_absent=0
descr_set_ambiguous=0
descr_set_stale_absent=0
fbw_rolled_back_with_effects=0
guard_failures=2
guard_failures=1
internal_compile_panics=0
loops_aborted=0
loops_compiled=1
2 changes: 1 addition & 1 deletion pyre/bench/synth/float_div_zero_caught_loop.wasm.jitstats
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ descr_set_absent=0
descr_set_ambiguous=0
descr_set_stale_absent=0
fbw_rolled_back_with_effects=0
guard_failures=613
guard_failures=611
internal_compile_panics=0
loops_aborted=0
loops_compiled=2
2 changes: 1 addition & 1 deletion pyre/bench/synth/foriter_body_return.wasm.jitstats
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ descr_set_absent=0
descr_set_ambiguous=0
descr_set_stale_absent=0
fbw_rolled_back_with_effects=0
guard_failures=612
guard_failures=604
internal_compile_panics=0
loops_aborted=0
loops_compiled=3
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ descr_set_absent=0
descr_set_ambiguous=0
descr_set_stale_absent=0
fbw_rolled_back_with_effects=0
guard_failures=2
guard_failures=1
internal_compile_panics=0
loops_aborted=1
loops_compiled=3
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ descr_set_absent=0
descr_set_ambiguous=0
descr_set_stale_absent=0
fbw_rolled_back_with_effects=0
guard_failures=2
guard_failures=1
internal_compile_panics=0
loops_aborted=1
loops_compiled=3
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ descr_set_absent=0
descr_set_ambiguous=0
descr_set_stale_absent=0
fbw_rolled_back_with_effects=0
guard_failures=2037
guard_failures=2027
internal_compile_panics=0
loops_aborted=0
loops_compiled=4
2 changes: 1 addition & 1 deletion pyre/bench/synth/gc_deque_backing_list.wasm.jitstats
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ descr_set_absent=0
descr_set_ambiguous=0
descr_set_stale_absent=0
fbw_rolled_back_with_effects=0
guard_failures=204
guard_failures=203
internal_compile_panics=0
loops_aborted=0
loops_compiled=5
2 changes: 1 addition & 1 deletion pyre/bench/synth/gc_iterator_source_drop.wasm.jitstats
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ descr_set_stale_absent=0
fbw_rolled_back_with_effects=0
field_pos_attached_misplaced=0
field_pos_spec_misplaced=0
guard_failures=614
guard_failures=613
internal_compile_panics=0
loops_aborted=0
loops_compiled=4
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ descr_set_absent=0
descr_set_ambiguous=0
descr_set_stale_absent=0
fbw_rolled_back_with_effects=0
guard_failures=14
guard_failures=2
internal_compile_panics=0
loops_aborted=0
loops_compiled=2
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ descr_set_absent=0
descr_set_ambiguous=0
descr_set_stale_absent=0
fbw_rolled_back_with_effects=0
guard_failures=409
guard_failures=408
internal_compile_panics=0
loops_aborted=0
loops_compiled=2
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ descr_set_absent=0
descr_set_ambiguous=0
descr_set_stale_absent=0
fbw_rolled_back_with_effects=0
guard_failures=10
guard_failures=4
internal_compile_panics=0
loops_aborted=3
loops_compiled=7
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ descr_set_absent=0
descr_set_ambiguous=0
descr_set_stale_absent=0
fbw_rolled_back_with_effects=0
guard_failures=815
guard_failures=813
internal_compile_panics=0
loops_aborted=0
loops_compiled=4
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ descr_set_absent=0
descr_set_ambiguous=0
descr_set_stale_absent=0
fbw_rolled_back_with_effects=0
guard_failures=613
guard_failures=611
internal_compile_panics=0
loops_aborted=0
loops_compiled=2
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ descr_set_absent=0
descr_set_ambiguous=0
descr_set_stale_absent=0
fbw_rolled_back_with_effects=0
guard_failures=402
guard_failures=401
internal_compile_panics=0
loops_aborted=1
loops_compiled=3
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ descr_set_absent=0
descr_set_ambiguous=0
descr_set_stale_absent=0
fbw_rolled_back_with_effects=0
guard_failures=824
guard_failures=819
internal_compile_panics=0
loops_aborted=0
loops_compiled=6
2 changes: 1 addition & 1 deletion pyre/bench/synth/list_ops.wasm.jitstats
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ descr_set_absent=0
descr_set_ambiguous=0
descr_set_stale_absent=0
fbw_rolled_back_with_effects=0
guard_failures=408
guard_failures=407
internal_compile_panics=0
loops_aborted=0
loops_compiled=7
2 changes: 1 addition & 1 deletion pyre/bench/synth/loops_comprehension.wasm.jitstats
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ descr_set_absent=0
descr_set_ambiguous=0
descr_set_stale_absent=0
fbw_rolled_back_with_effects=0
guard_failures=2613
guard_failures=2611
internal_compile_panics=0
loops_aborted=0
loops_compiled=7
Loading
Loading