Skip to content

probe attach doesn't compile in async contexts #723

Description

@labbott

While working on using humility as a library I ran into this:

error[E0277]: `OnceCell<Result<Option<Box<DwoUnit<EndianReader<LittleEndian, Arc<[u8]>>>>>, Error>>` cannot be shared between threads safely
    --> verifier/src/hiffy.rs:108:5
     |
 108 |     async fn get_measurement_log(&self) -> Result<Log, AttestError> {
     |     ^^^^^ `OnceCell<Result<Option<Box<DwoUnit<EndianReader<LittleEndian, Arc<[u8]>>>>>, Error>>` cannot be shared between threads safely
     |
     = help: within `[addr2line::unit::ResUnit<gimli::read::endian_reader::EndianReader<gimli::endianity::LittleEndian, Arc<[u8]>>>]`, the trait `Sync` is not implemented for `OnceCell<Result<Option<Box<DwoUnit<EndianReader<LittleEndian, Arc<[u8]>>>>>, Error>>`
     = note: if you want to do aliasing and mutation between multiple threads, use `std::sync::OnceLock` instead

...

note: required because it appears within the type `HubrisArchive`
    --> /home/labbott/.cargo/git/checkouts/humility-a1f94f6d75a1535e/80dae8d/humility-core/src/hubris.rs:1133:12
     |
1133 | pub struct HubrisArchive {
     |            ^^^^^^^^^^^^^
note: required because it appears within the type `AttestHiffy`
    --> verifier/src/hiffy.rs:66:12
     |
  66 | pub struct AttestHiffy {
     |            ^^^^^^^^^^^
     = note: required for `&AttestHiffy` to implement `Send`
note: required because it's used within this `async` block
    --> verifier/src/hiffy.rs:108:5
     |
 108 |     async fn get_measurement_log(&self) -> Result<Log, AttestError> {
     |     ^^^^^
     = note: required for the cast from `Pin<Box<{async block@verifier/src/hiffy.rs:108:5: 108:10}>>` to `Pin<Box<dyn Future<Output = Result<MeasurementLog<16>, AttestError>> + Send>>`
     = note: the full name for the type has been written to '/home/labbott/dice-util/target/debug/deps/dice_verifier-b365f235203b0dbe.long-type-6895664460909633821.txt'
     = note: consider using `--verbose` to print the full type name to the console

$ cat /home/labbott/dice-util/target/debug/deps/dice_verifier-b365f235203b0dbe.long-type-3655248516427123308.txt
std::ptr::Unique<[addr2line::unit::ResUnit<gimli::read::endian_reader::EndianReader<gimli::endianity::LittleEndian, Arc<[u8]>>>]>
hashbrown::raw::RawTable<(HubrisTask, addr2line::Context<gimli::read::endian_reader::EndianReader<gimli::endianity::LittleEndian, Arc<[u8]>>>)>
hashbrown::map::HashMap<HubrisTask, addr2line::Context<gimli::read::endian_reader::EndianReader<gimli::endianity::LittleEndian, Arc<[u8]>>>, RandomState>
HashMap<HubrisTask, addr2line::Context<gimli::read::endian_reader::EndianReader<gimli::endianity::LittleEndian, Arc<[u8]>>>>

This looks like the addr2line and gimli crates don't play nice with async at the moment and humility needs a little bit of refactoring.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions