diff --git a/openssl/src/stack.rs b/openssl/src/stack.rs index 4d5c0a136df98d0876937baa2e68245fdd2e2945..ac1e2a137cbe92f0d3a1fee833ece8e3dbaa02ab 100644 --- a/openssl/src/stack.rs +++ b/openssl/src/stack.rs @@ -40,15 +40,8 @@ pub trait Stackable: ForeignType { /// An owned stack of `T`. pub struct Stack<T: Stackable>(*mut T::StackType); -impl<T: Stackable> Stack<T> { - pub fn new() -> Result<Stack<T>, ErrorStack> { - unsafe { - ffi::init(); - let ptr = cvt_p(OPENSSL_sk_new_null())?; - Ok(Stack(ptr as *mut _)) - } - } -} +unsafe impl<T: Stackable + Send> Send for Stack<T> {} +unsafe impl<T: Stackable + Sync> Sync for Stack<T> {} impl<T: Stackable> Drop for Stack<T> { fn drop(&mut self) { @@ -59,6 +52,16 @@ impl<T: Stackable> Drop for Stack<T> { } } +impl<T: Stackable> Stack<T> { + pub fn new() -> Result<Stack<T>, ErrorStack> { + unsafe { + ffi::init(); + let ptr = cvt_p(OPENSSL_sk_new_null())?; + Ok(Stack(ptr as *mut _)) + } + } +} + impl<T: Stackable> iter::IntoIterator for Stack<T> { type IntoIter = IntoIter<T>; type Item = T; @@ -164,6 +167,9 @@ impl<T: Stackable> ExactSizeIterator for IntoIter<T> {} pub struct StackRef<T: Stackable>(Opaque, PhantomData<T>); +unsafe impl<T: Stackable + Send> Send for StackRef<T> {} +unsafe impl<T: Stackable + Sync> Sync for StackRef<T> {} + impl<T: Stackable> ForeignTypeRef for StackRef<T> { type CType = T::StackType; }