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?