Borrowed value does not live long enough with an Arc<Mutex<T>>

Viewed 113

In the example below, openvpn_client is created before the on_poll_read and on_poll_write. Therefore, it should be destructed after them (Playground):

use core::task::{Context, Poll};
use hyper::client::connect::{Connected, Connection};
use std::sync::{Arc, Mutex};

pub type OnPollRead = Arc<
    dyn Fn(&mut Context<'_>, &mut tokio::io::ReadBuf<'_>) -> Poll<std::io::Result<()>>
        + Send
        + Sync,
>;
pub type OnPollWrite = Arc<
    dyn Fn(&mut Context<'_>, &[u8]) -> Poll<core::result::Result<usize, std::io::Error>>
        + Send
        + Sync,
>;

#[derive(Clone)]
pub struct CustomTransporter {
    on_poll_read: Option<OnPollRead>,
    on_poll_write: Option<OnPollWrite>,
}

pub struct OVPNClient {}

impl OVPNClient {
    pub fn send(&self, buffer: &[u8]) {}
}

unsafe impl Send for OVPNClient {}

unsafe impl Send for CustomTransporter {}

impl CustomTransporter {
    pub fn new(
        on_poll_read: Option<OnPollRead>,
        on_poll_write: Option<OnPollWrite>,
    ) -> CustomTransporter {
        CustomTransporter {
            on_poll_read: on_poll_read,
            on_poll_write: on_poll_write,
        }
    }
}

fn main() {
    let openvpn_client = Arc::new(Mutex::new(OVPNClient {}));

    let on_poll_read = Arc::new(
        |context: &mut Context, buffer: &mut tokio::io::ReadBuf| -> Poll<std::io::Result<()>> {
            Poll::Ready(Ok(()))
        },
    );

    let on_poll_write = Arc::new(
        |context: &mut Context,
         buffer: &[u8]|
         -> Poll<core::result::Result<usize, std::io::Error>> {
            openvpn_client.lock().unwrap().send(buffer);
            Poll::Ready(Ok(0))
        },
    );

    let connector = CustomTransporter::new(Some(on_poll_read), Some(on_poll_write));
}

Error:

error[E0597]: `openvpn_client` does not live long enough
  --> src/main.rs:57:13
   |
54 | /         |context: &mut Context,
55 | |          buffer: &[u8]|
56 | |          -> Poll<core::result::Result<usize, std::io::Error>> {
   | |_____________________________________________________________- value captured here
57 |               openvpn_client.lock().unwrap().send(buffer);
   |               ^^^^^^^^^^^^^^ borrowed value does not live long enough
...
62 |       let connector = CustomTransporter::new(Some(on_poll_read), Some(on_poll_write));
   |                                                                       ------------- cast requires that `openvpn_client` is borrowed for `'static`
63 |   }
   |   - `openvpn_client` dropped here while still borrowed

Why does this error happen?

0 Answers
Related