diff options
-rw-r--r-- | src/listener.rs | 7 |
1 files changed, 7 insertions, 0 deletions
diff --git a/src/listener.rs b/src/listener.rs index a1a4c8e..e0dc315 100644 --- a/src/listener.rs +++ b/src/listener.rs @@ -11,6 +11,12 @@ pub struct Listener { sess: Arc<Mutex<SessionInner>>, } +// Listener is both Send and Sync; the compiler can't see it because it +// is pessimistic about the raw pointer. We use Arc/Mutex to guard accessing +// the raw pointer so we are safe for both. +unsafe impl Send for Listener {} +unsafe impl Sync for Listener {} + impl Listener { /// Accept a queued connection from this listener. pub fn accept(&mut self) -> Result<Channel, Error> { @@ -40,6 +46,7 @@ impl Listener { impl Drop for Listener { fn drop(&mut self) { + let _sess = self.sess.lock(); unsafe { let _ = raw::libssh2_channel_forward_cancel(self.raw); } |