@@ -13,9 +13,17 @@ pub(crate) struct PySliceContainer {
13
13
drop : unsafe fn ( * mut u8 , usize , usize ) ,
14
14
}
15
15
16
+ // This resembles `unsafe impl<T: Send> Send for PySliceContainer<T> {}` if we
17
+ // were allow to use a generic there.
18
+ // SAFETY: Every construction below enforces `T: Send` fulfilling the ideal bound above
16
19
unsafe impl Send for PySliceContainer { }
17
20
18
- impl < T : Send > From < Box < [ T ] > > for PySliceContainer {
21
+ // This resembles `unsafe impl<T: Sync> Sync for PySliceContainer<T> {}` if we
22
+ // were allow to use a generic there.
23
+ // SAFETY: Every construction below enforces `T: Sync` fulfilling the ideal bound above
24
+ unsafe impl Sync for PySliceContainer { }
25
+
26
+ impl < T : Send + Sync > From < Box < [ T ] > > for PySliceContainer {
19
27
fn from ( data : Box < [ T ] > ) -> Self {
20
28
unsafe fn drop_boxed_slice < T > ( ptr : * mut u8 , len : usize , _cap : usize ) {
21
29
let _ = Box :: from_raw ( ptr:: slice_from_raw_parts_mut ( ptr as * mut T , len) ) ;
@@ -39,7 +47,7 @@ impl<T: Send> From<Box<[T]>> for PySliceContainer {
39
47
}
40
48
}
41
49
42
- impl < T : Send > From < Vec < T > > for PySliceContainer {
50
+ impl < T : Send + Sync > From < Vec < T > > for PySliceContainer {
43
51
fn from ( data : Vec < T > ) -> Self {
44
52
unsafe fn drop_vec < T > ( ptr : * mut u8 , len : usize , cap : usize ) {
45
53
let _ = Vec :: from_raw_parts ( ptr as * mut T , len, cap) ;
@@ -65,7 +73,7 @@ impl<T: Send> From<Vec<T>> for PySliceContainer {
65
73
66
74
impl < A , D > From < ArrayBase < OwnedRepr < A > , D > > for PySliceContainer
67
75
where
68
- A : Send ,
76
+ A : Send + Sync ,
69
77
D : Dimension ,
70
78
{
71
79
fn from ( data : ArrayBase < OwnedRepr < A > , D > ) -> Self {
0 commit comments