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

Make Stack Sync + Send
This commit is contained in:
Steven Fackler 2018-05-20 15:35:07 -07:00 committed by GitHub
commit 83f6a24026
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 15 additions and 9 deletions

View File

@ -40,15 +40,8 @@ pub trait Stackable: ForeignType {
/// An owned stack of `T`. /// An owned stack of `T`.
pub struct Stack<T: Stackable>(*mut T::StackType); pub struct Stack<T: Stackable>(*mut T::StackType);
impl<T: Stackable> Stack<T> { unsafe impl<T: Stackable + Send> Send for Stack<T> {}
pub fn new() -> Result<Stack<T>, ErrorStack> { unsafe impl<T: Stackable + Sync> Sync for Stack<T> {}
unsafe {
ffi::init();
let ptr = cvt_p(OPENSSL_sk_new_null())?;
Ok(Stack(ptr as *mut _))
}
}
}
impl<T: Stackable> Drop for Stack<T> { impl<T: Stackable> Drop for Stack<T> {
fn drop(&mut self) { 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> { impl<T: Stackable> iter::IntoIterator for Stack<T> {
type IntoIter = IntoIter<T>; type IntoIter = IntoIter<T>;
type Item = T; type Item = T;
@ -164,6 +167,9 @@ impl<T: Stackable> ExactSizeIterator for IntoIter<T> {}
pub struct StackRef<T: Stackable>(Opaque, PhantomData<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> { impl<T: Stackable> ForeignTypeRef for StackRef<T> {
type CType = T::StackType; type CType = T::StackType;
} }