Unverified Commit 83f6a240 authored by Steven Fackler's avatar Steven Fackler Committed by GitHub
Browse files

Merge pull request #925 from sfackler/stack-sync-send

Make Stack Sync + Send
parents 9f5d7507 3ab1cc7a
Loading
Loading
Loading
Loading
+15 −9
Original line number Diff line number Diff line
@@ -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;
}