Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

AudioContext::resume not Send anymore? #501

Closed
b-ma opened this issue Apr 22, 2024 · 1 comment · Fixed by #502
Closed

AudioContext::resume not Send anymore? #501

b-ma opened this issue Apr 22, 2024 · 1 comment · Fixed by #502

Comments

@b-ma
Copy link
Collaborator

b-ma commented Apr 22, 2024

I have this error with AudioContext::resume after upgrading to 1.0.0-rc.6

error[E0277]: `std::sync::MutexGuard<'_, Box<dyn web_audio_api::io::AudioBackendManager>>` cannot be sent between threads safely
    --> src/audio_context.rs:177:13
     |
177  |       ctx.env.execute_tokio_future(
     |               ^^^^^^^^^^^^^^^^^^^^ `std::sync::MutexGuard<'_, Box<dyn web_audio_api::io::AudioBackendManager>>` cannot be sent between threads safely
178  | /         async move {
179  | |             context_clone.resume().await;
180  | |             Ok(())
181  | |         },
     | |_________- within this `{async block@src/audio_context.rs:178:9: 181:10}`
     |
     = help: within `{async block@src/audio_context.rs:178:9: 181:10}`, the trait `Send` is not implemented for `std::sync::MutexGuard<'_, Box<dyn web_audio_api::io::AudioBackendManager>>`, which is required by `{async block@src/audio_context.rs:178:9: 181:10}: Send`
     = note: required because it captures the following types: `std::sync::MutexGuard<'_, Box<dyn web_audio_api::io::AudioBackendManager>>`, `futures_channel::oneshot::Receiver<()>`
note: required because it's used within this `async` fn body
    --> src/index.crates.io-6f17d22bba15001f/web-audio-api-1.0.0-rc.6/src/context/online.rs:474:32
     |
474  |       pub async fn resume(&self) {
     |  ________________________________^
475  | |         // Lock the backend manager mutex to avoid concurrent calls
476  | |         log::debug!("Resume called, locking backend manager");
477  | |         let backend_manager_guard = self.backend_manager.lock().unwrap();
...    |
500  | |         log::debug!("Resumed audio graph");
501  | |     }
     | |_____^
     = note: required because it captures the following types: `impl Future<Output = ()>`
note: required because it's used within this `async` block
    --> src/audio_context.rs:178:9
     |
178  | /         async move {
179  | |             context_clone.resume().await;
180  | |             Ok(())
181  | |         },
     | |_________^
note: required by a bound in `napi::Env::execute_tokio_future`
    --> src/index.crates.io-6f17d22bba15001f/napi-2.16.4/src/env.rs:1075:18
     |
1072 |   pub fn execute_tokio_future<
     |          -------------------- required by a bound in this associated function
...
1075 |     F: 'static + Send + Future<Output = Result<T>>,
     |                  ^^^^ required by this bound in `Env::execute_tokio_future`

I imagine this is due to the fixes done in #499 but I can't figure out the problem

My wrapping code (which didn't change since previous version) is:

#[js_function]
fn resume(ctx: CallContext) -> Result<JsObject> {
    let js_this = ctx.this_unchecked::<JsObject>();
    let napi_context = ctx.env.unwrap::<NapiAudioContext>(&js_this)?;
    let context_clone = Arc::clone(&napi_context.0);

    ctx.env.execute_tokio_future(
        async move {
            context_clone.resume().await;
            Ok(())
        },
        |&mut env, _val| env.get_undefined(),
    )
}
@orottier
Copy link
Owner

Ugh, classic async Rust. Apparently we are carrying a non-Send variable across an await point in the new version. I will have a look and add regression tests for all Future return types.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging a pull request may close this issue.

2 participants