Skip to content

Commit 7638cdb

Browse files
committed
Implement Send/Sync for Mat, Ptr and Tuple
1 parent c381ec3 commit 7638cdb

File tree

4 files changed

+33
-1
lines changed

4 files changed

+33
-1
lines changed

src/manual/core/mat.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -764,6 +764,8 @@ impl<T: MatTrait + ?Sized> MatTraitManual for T {}
764764
input_output_array! { Mat, from_mat, from_mat_mut }
765765
input_output_array_vector! { Mat, from_mat_vec, from_mat_vec_mut }
766766

767+
unsafe impl Sync for Mat {}
768+
767769
impl fmt::Debug for Mat {
768770
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
769771
let typ = self.typ();

src/manual/core/ptr.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,3 +79,7 @@ where
7979
unsafe { self.extern_delete() }
8080
}
8181
}
82+
83+
unsafe impl<T: Send> Send for Ptr<T> where Self: PtrExtern {}
84+
85+
unsafe impl<T: Sync> Sync for Ptr<T> where Self: PtrExtern {}

src/manual/core/tuple.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,3 +96,7 @@ macro_rules! tuple_extern {
9696
}
9797
};
9898
}
99+
100+
unsafe impl<T: Send> Send for Tuple<T> where Self: TupleExtern {}
101+
102+
unsafe impl<T: Sync> Sync for Tuple<T> where Self: TupleExtern {}

tests/mat.rs

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
use std::ffi::c_void;
2-
use std::mem;
2+
use std::{mem, thread};
33

44
use matches::assert_matches;
55

@@ -1217,3 +1217,25 @@ fn mat_reshape() -> Result<()> {
12171217

12181218
Ok(())
12191219
}
1220+
1221+
#[test]
1222+
fn mat_send_sync() -> Result<()> {
1223+
{
1224+
let m = Mat::new_rows_cols_with_default(3, 3, u8::opencv_type(), 123.into()).unwrap();
1225+
thread::spawn(move || assert_eq!(123, *m.at::<u8>(1).unwrap()))
1226+
.join()
1227+
.unwrap();
1228+
}
1229+
1230+
{
1231+
let mut m = Mat::new_rows_cols_with_default(3, 3, u8::opencv_type(), 123.into()).unwrap();
1232+
thread::scope(|s| {
1233+
s.spawn(|| {
1234+
*m.at_2d_mut::<u8>(1, 1).unwrap() = 10;
1235+
});
1236+
});
1237+
assert_eq!(10, *m.at_2d::<u8>(1, 1).unwrap());
1238+
}
1239+
1240+
Ok(())
1241+
}

0 commit comments

Comments
 (0)