diff options
author | Mathias Hall-Andersen <mathias@hall-andersen.dk> | 2019-09-02 23:32:07 +0200 |
---|---|---|
committer | Mathias Hall-Andersen <mathias@hall-andersen.dk> | 2019-09-02 23:32:07 +0200 |
commit | f55014ef8ff7308d37be9c92f41b9ccf809c719d (patch) | |
tree | 0a8ea562dd872b1a5a0a2271256bd1b6d6d5d731 /src/router/device.rs | |
parent | Reconsider inorder queueing (diff) | |
download | wireguard-rs-f55014ef8ff7308d37be9c92f41b9ccf809c719d.tar.xz wireguard-rs-f55014ef8ff7308d37be9c92f41b9ccf809c719d.zip |
Wake workers when submitting work
Diffstat (limited to 'src/router/device.rs')
-rw-r--r-- | src/router/device.rs | 17 |
1 files changed, 8 insertions, 9 deletions
diff --git a/src/router/device.rs b/src/router/device.rs index f1cbb70..ec6453d 100644 --- a/src/router/device.rs +++ b/src/router/device.rs @@ -6,6 +6,8 @@ use std::sync::{Arc, Weak}; use std::thread; use std::time::Instant; +use parking_lot::{Condvar, Mutex}; + use crossbeam_deque::{Injector, Worker}; use spin; use treebitmap::IpLookupTable; @@ -40,8 +42,8 @@ pub struct DeviceInner<C: Callbacks, T: Tun, B: Bind> { pub call_need_key: C::CallbackKey, // threading and workers + pub waker: (Mutex<()>, Condvar), pub running: AtomicBool, // workers running? - pub parked: AtomicBool, // any workers parked? pub injector: Injector<JobParallel<C, T, B>>, // parallel enc/dec task injector // routing @@ -107,7 +109,7 @@ impl<O: Opaque, R: Callback<O>, S: Callback<O>, K: KeyCallback<O>, T: Tun, B: Bi call_recv, call_send, call_need_key, - parked: AtomicBool::new(false), + waker: (Mutex::new(()), Condvar::new()), running: AtomicBool::new(true), injector: Injector::new(), recv: spin::RwLock::new(HashMap::new()), @@ -208,15 +210,12 @@ impl<C: Callbacks, T: Tun, B: Bind> Device<C, T, B> { // schedule for encryption and transmission to peer if let Some(job) = peer.send_job(msg) { - println!("made job!"); + // add job to parallel worker pool self.0.injector.push((peer.clone(), job)); - } - // ensure workers running - if self.0.parked.load(Ordering::Acquire) { - for handle in &self.1 { - handle.thread().unpark(); - } + // ensure workers running, TODO: something faster + let &(_, ref cvar) = &self.0.waker; + cvar.notify_all(); } Ok(()) |