From b12dbfb6c1c99c58ff34a3c8ecff9b216c583dd8 Mon Sep 17 00:00:00 2001 From: Trevor Elliott Date: Fri, 28 Jun 2024 14:48:12 -0700 Subject: [PATCH] Remove some unused memory management code in the adapter (#398) After #394 there were some unused functions in the adapter that didn't fail in CI as we don't currently build the adapter in CI. This PR removes the unused code, and also builds the adapter in CI. --- .github/workflows/test.yml | 2 + crates/adapter/src/descriptors.rs | 14 ++----- crates/adapter/src/lib.rs | 50 +++--------------------- lib/data/viceroy-component-adapter.wasm | Bin 171968 -> 172824 bytes 4 files changed, 11 insertions(+), 55 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 63bfbf48..d063faa3 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -43,6 +43,8 @@ jobs: - name: test run: make ci shell: bash + - name: adapter + run: cargo build --release -p viceroy-component-adapter --target wasm32-unknown-unknown # Run the trap test in an isolated job. It needs different cargo features than the usual build, so # it entails rebuilding the whole workspace if we combine them in a single job. This way, we diff --git a/crates/adapter/src/descriptors.rs b/crates/adapter/src/descriptors.rs index bd4fd763..ea17a55d 100644 --- a/crates/adapter/src/descriptors.rs +++ b/crates/adapter/src/descriptors.rs @@ -57,13 +57,7 @@ impl Streams { pub enum StreamType { /// Streams for implementing stdio. - Stdio(Stdio), -} - -pub enum Stdio { - Stdin, - Stdout, - Stderr, + Stdio, } #[repr(C)] @@ -94,19 +88,19 @@ impl Descriptors { d.push(Descriptor::Streams(Streams { input: new_once(stdin::get_stdin()), output: OnceCell::new(), - type_: StreamType::Stdio(Stdio::Stdin), + type_: StreamType::Stdio, })) .trapping_unwrap(); d.push(Descriptor::Streams(Streams { input: OnceCell::new(), output: new_once(stdout::get_stdout()), - type_: StreamType::Stdio(Stdio::Stdout), + type_: StreamType::Stdio, })) .trapping_unwrap(); d.push(Descriptor::Streams(Streams { input: OnceCell::new(), output: new_once(stderr::get_stderr()), - type_: StreamType::Stdio(Stdio::Stderr), + type_: StreamType::Stdio, })) .trapping_unwrap(); diff --git a/crates/adapter/src/lib.rs b/crates/adapter/src/lib.rs index 531d903a..aab88d1e 100644 --- a/crates/adapter/src/lib.rs +++ b/crates/adapter/src/lib.rs @@ -1,3 +1,6 @@ +// Promote warnings into errors, when building in release mode. +#![cfg_attr(not(debug_assertions), deny(warnings))] + use crate::bindings::wasi::clocks::{monotonic_clock, wall_clock}; use crate::bindings::wasi::io::poll; use crate::bindings::wasi::io::streams; @@ -219,22 +222,6 @@ enum ImportAlloc { pointers: BumpAlloc, }, - /// An allocator specifically for getting the nth string allocation used - /// for preopens. - /// - /// This will allocate everything into `alloc`. All strings other than the - /// `nth` string, however, will be discarded (the allocator's state is reset - /// after the allocation). This means that the pointer returned for the - /// `nth` string will be retained in `alloc` while all others will be - /// discarded. - /// - /// The `cur` count starts at 0 and counts up per-string. - GetPreopenPath { - cur: u32, - nth: u32, - alloc: BumpAlloc, - }, - /// No import allocator is configured and if an allocation happens then /// this will abort. None, @@ -301,12 +288,6 @@ impl ImportAlloc { // WASI doesn't say all the strings have to be adjacent, so this // should work out in practice. // - // * Finally for `GetPreopenPath` this works out only insofar that the - // `State::temporary_alloc` space is used to store the path. The - // WASI-provided buffer is precisely sized, not overly large, meaning - // that we're forced to copy from `temporary_alloc` into the - // destination buffer for this WASI call. - // // Basically it's a case-by-case basis here that enables ignoring // shrinking return calls here. Not robust. if !old_ptr.is_null() { @@ -338,18 +319,6 @@ impl ImportAlloc { alloc.alloc(align, size) } } - ImportAlloc::GetPreopenPath { cur, nth, alloc } => { - if align == 1 { - let real_alloc = *nth == *cur; - if real_alloc { - alloc.alloc(align, size) - } else { - alloc.clone().alloc(align, size) - } - } else { - alloc.alloc(align, size) - } - } ImportAlloc::None => { unreachable!("no allocator configured") } @@ -1181,7 +1150,7 @@ pub unsafe extern "C" fn poll_oneoff( .trapping_unwrap(); match desc { Descriptor::Streams(streams) => match &streams.type_ { - StreamType::Stdio(_) => (ERRNO_SUCCESS, 1, 0), + StreamType::Stdio => (ERRNO_SUCCESS, 1, 0), }, _ => unreachable!(), } @@ -1194,7 +1163,7 @@ pub unsafe extern "C" fn poll_oneoff( .trapping_unwrap(); match desc { Descriptor::Streams(streams) => match &streams.type_ { - StreamType::Stdio(_) => (ERRNO_SUCCESS, 1, 0), + StreamType::Stdio => (ERRNO_SUCCESS, 1, 0), }, _ => unreachable!(), } @@ -1614,15 +1583,6 @@ impl State { } } - /// Configure that `cabi_import_realloc` will allocate once from - /// `self.temporary_data` for the duration of the closure `f`. - /// - /// Panics if the import allocator is already configured. - fn with_one_temporary_alloc(&self, f: impl FnOnce() -> T) -> T { - let alloc = unsafe { self.temporary_alloc() }; - self.with_import_alloc(ImportAlloc::OneAlloc(alloc), f).0 - } - /// Configure that `cabi_import_realloc` will allocate once from /// `base` with at most `len` bytes for the duration of `f`. /// diff --git a/lib/data/viceroy-component-adapter.wasm b/lib/data/viceroy-component-adapter.wasm index dbc20be7a5cc0ada3b7b57723aa3652b248a5cc8..d642012d2d6bb13300fd47d22e98efae90304cc3 100755 GIT binary patch delta 32092 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 delta 32845 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%0Dr9vuwI*Cwyfcyg$rXn;zRc0qiZ}&lfQShon3Bj8 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