mirror of
https://github.com/tokio-rs/tokio.git
synced 2026-08-22 00:00:11 +02:00
* Change a return value of reactor::poll to io::Result.
* Revert "Change a return value of reactor::poll to io::Result."
This reverts commit 281d8c32d4.
* Return a result from reactor::poll.
* Drop a reactor if any error occurs. Fix warnings in tests.
* Update a documentation for reactor::turn.
* Unwrap the last turn() call in tests.
55 lines
1.3 KiB
Rust
55 lines
1.3 KiB
Rust
use std::io;
|
|
use std::thread;
|
|
use std::sync::Arc;
|
|
use std::sync::atomic::{AtomicBool, Ordering};
|
|
|
|
use reactor::{Reactor, Handle};
|
|
|
|
pub struct HelperThread {
|
|
thread: Option<thread::JoinHandle<()>>,
|
|
reactor: Handle,
|
|
done: Arc<AtomicBool>,
|
|
}
|
|
|
|
impl HelperThread {
|
|
pub fn new() -> io::Result<HelperThread> {
|
|
let reactor = Reactor::new()?;
|
|
let reactor_handle = reactor.handle().clone();
|
|
let done = Arc::new(AtomicBool::new(false));
|
|
let done2 = done.clone();
|
|
let thread = thread::Builder::new().spawn(move || run(reactor, done))?;
|
|
|
|
Ok(HelperThread {
|
|
thread: Some(thread),
|
|
reactor: reactor_handle,
|
|
done: done2,
|
|
})
|
|
}
|
|
|
|
pub fn handle(&self) -> &Handle {
|
|
&self.reactor
|
|
}
|
|
|
|
pub fn forget(mut self) {
|
|
drop(self.thread.take());
|
|
}
|
|
}
|
|
|
|
impl Drop for HelperThread {
|
|
fn drop(&mut self) {
|
|
let thread = match self.thread.take() {
|
|
Some(thread) => thread,
|
|
None => return
|
|
};
|
|
self.done.store(true, Ordering::SeqCst);
|
|
self.reactor.wakeup();
|
|
thread.join().unwrap();
|
|
}
|
|
}
|
|
|
|
fn run(mut reactor: Reactor, done: Arc<AtomicBool>) {
|
|
while !done.load(Ordering::SeqCst) {
|
|
reactor.turn(None).unwrap();
|
|
}
|
|
}
|