summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWez Furlong <wez@wezfurlong.org>2020-01-18 16:28:12 -0800
committerWez Furlong <wez@wezfurlong.org>2020-01-18 16:28:12 -0800
commit92f466c07ccded1fe58f245320542cca69267e7e (patch)
tree1f0ae584aa79ab88a747a1acc402a2eafd19e983
parenta22780feb63945bd549735e17b48074b4d7b1419 (diff)
downloadssh2-rs-92f466c07ccded1fe58f245320542cca69267e7e.zip
ChannelInner is Send + Sync
This allows Channel and Stream to be Send
-rw-r--r--src/channel.rs6
-rw-r--r--tests/all/channel.rs7
2 files changed, 13 insertions, 0 deletions
diff --git a/src/channel.rs b/src/channel.rs
index 1169a65..82ac981 100644
--- a/src/channel.rs
+++ b/src/channel.rs
@@ -14,6 +14,12 @@ struct ChannelInner {
read_limit: Mutex<Option<u64>>,
}
+// ChannelInner 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 ChannelInner {}
+unsafe impl Sync for ChannelInner {}
+
struct LockedChannel<'a> {
raw: *mut raw::LIBSSH2_CHANNEL,
sess: MutexGuard<'a, SessionInner>,
diff --git a/tests/all/channel.rs b/tests/all/channel.rs
index 8b624ac..2f14d01 100644
--- a/tests/all/channel.rs
+++ b/tests/all/channel.rs
@@ -24,6 +24,13 @@ fn consume_stdio(channel: &mut Channel) -> (String, String) {
fn smoke() {
let sess = ::authed_session();
let mut channel = sess.channel_session().unwrap();
+
+ fn must_be_send<T: Send>(_: &T) -> bool {
+ true
+ }
+ assert!(must_be_send(&channel));
+ assert!(must_be_send(&channel.stream(0)));
+
channel.flush().unwrap();
channel.exec("true").unwrap();
consume_stdio(&mut channel);