annotate rust/pyo3-sharedref/tests/test_sharedref.rs @ 52640:78b2894cd58c

rust-pyo3-sharedref: demonstrate SharedByPyObject borrow unsafety We take the existing doc-comment from rust-cpython and make it compile (validated by `cargo test`). With the added explanations, the ordinary comment was no longer useful, we could therefore remove it. The new explanation stresses that "not leaking the internal faked reference" is definitely not enough, because the problem is about *all references* that can be derived from it. We ended up duplicating the explanation, because that is a way to ensure that people do not miss it. Also, it was a bit misleading that the previous example was for `try_borrow_mut()`, so we made a similar, simpler one for `try_borrow()`.
author Georges Racinet <georges.racinet@cloudcrane.io>
date Mon, 16 Dec 2024 13:08:55 +0100
parents ac0cb3c334a1
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
52632
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
1 use pyo3::prelude::*;
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
2 use pyo3_sharedref::*;
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
3
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
4 #[pyclass]
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
5 struct Owner {
52635
c25d345f5aa5 rust-pyo3-sharedref: renamed PySharedRefCell to PyShareable
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52634
diff changeset
6 string: PyShareable<String>,
52632
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
7 }
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
8
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
9 #[pymethods]
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
10 impl Owner {
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
11 #[new]
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
12 fn new(s: String) -> Self {
52633
d85514a88706 rust-pyo3-sharedref: reworked constructors
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52632
diff changeset
13 Self { string: s.into() }
52632
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
14 }
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
15 }
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
16
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
17 fn with_setup(
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
18 test: impl FnOnce(Python<'_>, &Bound<'_, Owner>) -> PyResult<()>,
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
19 ) -> PyResult<()> {
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
20 pyo3::prepare_freethreaded_python();
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
21 Python::with_gil(|py| {
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
22 let owner = Bound::new(py, Owner::new("new".to_owned()))?;
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
23 test(py, &owner)
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
24 })
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
25 }
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
26
52636
4a73eb3923ac rust-pyo3-sharedref: renamed UnsafePyLeaked to SharedByPyObject
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52635
diff changeset
27 /// "leak" in the sense of `SharedByPyObject` the `string` data field,
52632
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
28 /// taking care of all the boilerplate
52638
ac0cb3c334a1 rust-pyo3-sharedref: renamings in test
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52637
diff changeset
29 fn share_string(
ac0cb3c334a1 rust-pyo3-sharedref: renamings in test
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52637
diff changeset
30 owner: &Bound<'_, Owner>,
ac0cb3c334a1 rust-pyo3-sharedref: renamings in test
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52637
diff changeset
31 ) -> SharedByPyObject<&'static String> {
ac0cb3c334a1 rust-pyo3-sharedref: renamings in test
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52637
diff changeset
32 let shareable = &owner.borrow().string;
ac0cb3c334a1 rust-pyo3-sharedref: renamings in test
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52637
diff changeset
33 unsafe { shareable.share(owner) }
52632
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
34 }
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
35
52638
ac0cb3c334a1 rust-pyo3-sharedref: renamings in test
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52637
diff changeset
36 fn try_share_string(
52632
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
37 owner: &Bound<'_, Owner>,
52636
4a73eb3923ac rust-pyo3-sharedref: renamed UnsafePyLeaked to SharedByPyObject
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52635
diff changeset
38 ) -> Result<SharedByPyObject<&'static String>, TryShareError> {
52638
ac0cb3c334a1 rust-pyo3-sharedref: renamings in test
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52637
diff changeset
39 let shareable = &owner.borrow().string;
ac0cb3c334a1 rust-pyo3-sharedref: renamings in test
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52637
diff changeset
40 unsafe { shareable.try_share(owner) }
52632
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
41 }
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
42
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
43 /// Mutate the `string` field of `owner` as would be done from Python code
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
44 ///
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
45 /// This is to simulate normal mutation of the owner object from
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
46 /// the Python interpreter. This could be replaced by methods of [`Owner`]
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
47 /// (wih closure replaced by a small fixed operations)
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
48 /// and perhaps will, once we are done converting the original tests
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
49 /// from rust-cpython
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
50 fn mutate_string<'py>(
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
51 owner: &'py Bound<'py, Owner>,
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
52 f: impl FnOnce(&mut String),
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
53 ) -> () {
52638
ac0cb3c334a1 rust-pyo3-sharedref: renamings in test
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52637
diff changeset
54 let shareable = &owner.borrow_mut().string;
ac0cb3c334a1 rust-pyo3-sharedref: renamings in test
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52637
diff changeset
55 let shared_ref = unsafe { shareable.borrow_with_owner(owner) };
52634
d1e304025b90 rust-pyo3-sharedref: replaced borrow/borrow_mut with RwLock namings
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52633
diff changeset
56 f(&mut shared_ref.write());
52632
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
57 }
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
58
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
59 #[test]
52638
ac0cb3c334a1 rust-pyo3-sharedref: renamings in test
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52637
diff changeset
60 fn test_shared_borrow() -> PyResult<()> {
52632
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
61 with_setup(|py, owner| {
52638
ac0cb3c334a1 rust-pyo3-sharedref: renamings in test
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52637
diff changeset
62 let shared = share_string(owner);
ac0cb3c334a1 rust-pyo3-sharedref: renamings in test
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52637
diff changeset
63 let shared_ref = unsafe { shared.try_borrow(py) }.unwrap();
ac0cb3c334a1 rust-pyo3-sharedref: renamings in test
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52637
diff changeset
64 assert_eq!(*shared_ref, "new");
52632
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
65 Ok(())
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
66 })
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
67 }
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
68
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
69 #[test]
52638
ac0cb3c334a1 rust-pyo3-sharedref: renamings in test
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52637
diff changeset
70 fn test_shared_borrow_mut() -> PyResult<()> {
52632
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
71 with_setup(|py, owner| {
52638
ac0cb3c334a1 rust-pyo3-sharedref: renamings in test
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52637
diff changeset
72 let shared = share_string(owner);
ac0cb3c334a1 rust-pyo3-sharedref: renamings in test
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52637
diff changeset
73 let mut shared_iter = unsafe { shared.map(py, |s| s.chars()) };
ac0cb3c334a1 rust-pyo3-sharedref: renamings in test
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52637
diff changeset
74 let mut shared_ref =
ac0cb3c334a1 rust-pyo3-sharedref: renamings in test
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52637
diff changeset
75 unsafe { shared_iter.try_borrow_mut(py) }.unwrap();
ac0cb3c334a1 rust-pyo3-sharedref: renamings in test
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52637
diff changeset
76 assert_eq!(shared_ref.next(), Some('n'));
ac0cb3c334a1 rust-pyo3-sharedref: renamings in test
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52637
diff changeset
77 assert_eq!(shared_ref.next(), Some('e'));
ac0cb3c334a1 rust-pyo3-sharedref: renamings in test
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52637
diff changeset
78 assert_eq!(shared_ref.next(), Some('w'));
ac0cb3c334a1 rust-pyo3-sharedref: renamings in test
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52637
diff changeset
79 assert_eq!(shared_ref.next(), None);
52632
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
80 Ok(())
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
81 })
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
82 }
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
83
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
84 #[test]
52638
ac0cb3c334a1 rust-pyo3-sharedref: renamings in test
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52637
diff changeset
85 fn test_shared_borrow_after_mut() -> PyResult<()> {
52632
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
86 with_setup(|py, owner| {
52638
ac0cb3c334a1 rust-pyo3-sharedref: renamings in test
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52637
diff changeset
87 let shared = share_string(owner);
52632
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
88 mutate_string(owner, String::clear);
52638
ac0cb3c334a1 rust-pyo3-sharedref: renamings in test
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52637
diff changeset
89 assert!(unsafe { shared.try_borrow(py) }.is_err());
52632
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
90 Ok(())
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
91 })
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
92 }
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
93
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
94 #[test]
52638
ac0cb3c334a1 rust-pyo3-sharedref: renamings in test
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52637
diff changeset
95 fn test_shared_borrow_mut_after_mut() -> PyResult<()> {
52632
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
96 with_setup(|py, owner| {
52638
ac0cb3c334a1 rust-pyo3-sharedref: renamings in test
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52637
diff changeset
97 let shared = share_string(owner);
ac0cb3c334a1 rust-pyo3-sharedref: renamings in test
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52637
diff changeset
98 let mut shared_iter = unsafe { shared.map(py, |s| s.chars()) };
52632
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
99
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
100 mutate_string(owner, String::clear);
52638
ac0cb3c334a1 rust-pyo3-sharedref: renamings in test
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52637
diff changeset
101 assert!(unsafe { shared_iter.try_borrow_mut(py) }.is_err());
52632
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
102 Ok(())
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
103 })
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
104 }
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
105
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
106 #[test]
52636
4a73eb3923ac rust-pyo3-sharedref: renamed UnsafePyLeaked to SharedByPyObject
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52635
diff changeset
107 #[should_panic(expected = "map() over invalidated shared reference")]
52638
ac0cb3c334a1 rust-pyo3-sharedref: renamings in test
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52637
diff changeset
108 fn test_shared_map_after_mut() {
52632
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
109 with_setup(|py, owner| {
52638
ac0cb3c334a1 rust-pyo3-sharedref: renamings in test
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52637
diff changeset
110 let shared = share_string(owner);
52632
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
111 mutate_string(owner, String::clear);
52638
ac0cb3c334a1 rust-pyo3-sharedref: renamings in test
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52637
diff changeset
112 let _shared_iter = unsafe { shared.map(py, |s| s.chars()) };
52632
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
113 Ok(())
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
114 })
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
115 .expect("should already have panicked")
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
116 }
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
117
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
118 /// run `try_borrow_mut` on the `string` field and assert it is not an error
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
119 ///
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
120 /// Simply returning the `Result` is not possible, because that is
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
121 /// returning a reference to data owned by the function
52634
d1e304025b90 rust-pyo3-sharedref: replaced borrow/borrow_mut with RwLock namings
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52633
diff changeset
122 fn assert_try_write_string_ok(owner: &Bound<'_, Owner>) {
52638
ac0cb3c334a1 rust-pyo3-sharedref: renamings in test
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52637
diff changeset
123 let shareable = &owner.borrow().string;
ac0cb3c334a1 rust-pyo3-sharedref: renamings in test
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52637
diff changeset
124 let shared_ref = unsafe { shareable.borrow_with_owner(owner) };
52634
d1e304025b90 rust-pyo3-sharedref: replaced borrow/borrow_mut with RwLock namings
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52633
diff changeset
125 assert!(shared_ref.try_write().is_ok());
52632
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
126 }
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
127
52634
d1e304025b90 rust-pyo3-sharedref: replaced borrow/borrow_mut with RwLock namings
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52633
diff changeset
128 fn assert_try_write_string_err(owner: &Bound<'_, Owner>) {
52638
ac0cb3c334a1 rust-pyo3-sharedref: renamings in test
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52637
diff changeset
129 let shareable = &owner.borrow().string;
ac0cb3c334a1 rust-pyo3-sharedref: renamings in test
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52637
diff changeset
130 let shared_ref = unsafe { shareable.borrow_with_owner(owner) };
52634
d1e304025b90 rust-pyo3-sharedref: replaced borrow/borrow_mut with RwLock namings
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52633
diff changeset
131 assert!(shared_ref.try_write().is_err());
52632
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
132 }
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
133
52634
d1e304025b90 rust-pyo3-sharedref: replaced borrow/borrow_mut with RwLock namings
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52633
diff changeset
134 fn assert_try_read_string_err(owner: &Bound<'_, Owner>) {
52638
ac0cb3c334a1 rust-pyo3-sharedref: renamings in test
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52637
diff changeset
135 let shareable = &owner.borrow().string;
ac0cb3c334a1 rust-pyo3-sharedref: renamings in test
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52637
diff changeset
136 let shared_ref = unsafe { shareable.borrow_with_owner(owner) };
52634
d1e304025b90 rust-pyo3-sharedref: replaced borrow/borrow_mut with RwLock namings
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52633
diff changeset
137 assert!(shared_ref.try_read().is_err());
52632
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
138 }
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
139
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
140 #[test]
52638
ac0cb3c334a1 rust-pyo3-sharedref: renamings in test
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52637
diff changeset
141 fn test_try_write_while_shared_ref() -> PyResult<()> {
52632
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
142 with_setup(|py, owner| {
52634
d1e304025b90 rust-pyo3-sharedref: replaced borrow/borrow_mut with RwLock namings
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52633
diff changeset
143 assert_try_write_string_ok(owner);
52638
ac0cb3c334a1 rust-pyo3-sharedref: renamings in test
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52637
diff changeset
144 let shared = share_string(owner);
52632
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
145 {
52638
ac0cb3c334a1 rust-pyo3-sharedref: renamings in test
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52637
diff changeset
146 let _shared_ref = unsafe { shared.try_borrow(py) }.unwrap();
52634
d1e304025b90 rust-pyo3-sharedref: replaced borrow/borrow_mut with RwLock namings
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52633
diff changeset
147 assert_try_write_string_err(owner);
52632
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
148 {
52638
ac0cb3c334a1 rust-pyo3-sharedref: renamings in test
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52637
diff changeset
149 let _shared_ref2 = unsafe { shared.try_borrow(py) }.unwrap();
52634
d1e304025b90 rust-pyo3-sharedref: replaced borrow/borrow_mut with RwLock namings
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52633
diff changeset
150 assert_try_write_string_err(owner);
52632
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
151 }
52634
d1e304025b90 rust-pyo3-sharedref: replaced borrow/borrow_mut with RwLock namings
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52633
diff changeset
152 assert_try_write_string_err(owner);
52632
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
153 }
52634
d1e304025b90 rust-pyo3-sharedref: replaced borrow/borrow_mut with RwLock namings
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52633
diff changeset
154 assert_try_write_string_ok(owner);
52632
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
155 Ok(())
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
156 })
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
157 }
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
158
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
159 #[test]
52638
ac0cb3c334a1 rust-pyo3-sharedref: renamings in test
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52637
diff changeset
160 fn test_try_write_while_shared_ref_mut() -> PyResult<()> {
52632
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
161 with_setup(|py, owner| {
52634
d1e304025b90 rust-pyo3-sharedref: replaced borrow/borrow_mut with RwLock namings
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52633
diff changeset
162 assert_try_write_string_ok(owner);
52638
ac0cb3c334a1 rust-pyo3-sharedref: renamings in test
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52637
diff changeset
163 let shared = share_string(owner);
ac0cb3c334a1 rust-pyo3-sharedref: renamings in test
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52637
diff changeset
164 let mut shared_iter = unsafe { shared.map(py, |s| s.chars()) };
52632
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
165 {
52638
ac0cb3c334a1 rust-pyo3-sharedref: renamings in test
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52637
diff changeset
166 let _shared_ref =
ac0cb3c334a1 rust-pyo3-sharedref: renamings in test
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52637
diff changeset
167 unsafe { shared_iter.try_borrow_mut(py) }.unwrap();
52634
d1e304025b90 rust-pyo3-sharedref: replaced borrow/borrow_mut with RwLock namings
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52633
diff changeset
168 assert_try_write_string_err(owner);
52632
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
169 }
52634
d1e304025b90 rust-pyo3-sharedref: replaced borrow/borrow_mut with RwLock namings
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52633
diff changeset
170 assert_try_write_string_ok(owner);
52632
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
171 Ok(())
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
172 })
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
173 }
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
174
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
175 #[test]
52638
ac0cb3c334a1 rust-pyo3-sharedref: renamings in test
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52637
diff changeset
176 fn test_try_share_while_write() -> PyResult<()> {
52632
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
177 with_setup(|_py, owner| {
52638
ac0cb3c334a1 rust-pyo3-sharedref: renamings in test
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52637
diff changeset
178 let shareable = &owner.borrow().string;
ac0cb3c334a1 rust-pyo3-sharedref: renamings in test
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52637
diff changeset
179 let shared_ref = unsafe { shareable.borrow_with_owner(owner) };
52634
d1e304025b90 rust-pyo3-sharedref: replaced borrow/borrow_mut with RwLock namings
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52633
diff changeset
180 let _mut_ref = shared_ref.write();
52632
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
181
52638
ac0cb3c334a1 rust-pyo3-sharedref: renamings in test
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52637
diff changeset
182 assert!(try_share_string(owner).is_err());
52632
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
183 Ok(())
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
184 })
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
185 }
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
186
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
187 #[test]
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
188 #[should_panic(expected = "already mutably borrowed")]
52638
ac0cb3c334a1 rust-pyo3-sharedref: renamings in test
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52637
diff changeset
189 fn test_share_while_write() {
52632
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
190 with_setup(|_py, owner| {
52638
ac0cb3c334a1 rust-pyo3-sharedref: renamings in test
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52637
diff changeset
191 let shareable = &owner.borrow().string;
ac0cb3c334a1 rust-pyo3-sharedref: renamings in test
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52637
diff changeset
192 let shared_ref = unsafe { shareable.borrow_with_owner(owner) };
52634
d1e304025b90 rust-pyo3-sharedref: replaced borrow/borrow_mut with RwLock namings
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52633
diff changeset
193 let _mut_ref = shared_ref.write();
52632
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
194
52638
ac0cb3c334a1 rust-pyo3-sharedref: renamings in test
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52637
diff changeset
195 share_string(owner);
52632
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
196 Ok(())
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
197 })
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
198 .expect("should already have panicked")
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
199 }
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
200
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
201 #[test]
52634
d1e304025b90 rust-pyo3-sharedref: replaced borrow/borrow_mut with RwLock namings
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52633
diff changeset
202 fn test_try_write_while_borrow() -> PyResult<()> {
52632
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
203 with_setup(|_py, owner| {
52638
ac0cb3c334a1 rust-pyo3-sharedref: renamings in test
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52637
diff changeset
204 let shareable = &owner.borrow().string;
ac0cb3c334a1 rust-pyo3-sharedref: renamings in test
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52637
diff changeset
205 let shared_ref = unsafe { shareable.borrow_with_owner(owner) };
52634
d1e304025b90 rust-pyo3-sharedref: replaced borrow/borrow_mut with RwLock namings
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52633
diff changeset
206 let _ref = shared_ref.read();
52632
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
207
52634
d1e304025b90 rust-pyo3-sharedref: replaced borrow/borrow_mut with RwLock namings
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52633
diff changeset
208 assert_try_write_string_err(owner);
52632
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
209 Ok(())
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
210 })
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
211 }
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
212
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
213 #[test]
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
214 #[should_panic(expected = "already borrowed")]
52634
d1e304025b90 rust-pyo3-sharedref: replaced borrow/borrow_mut with RwLock namings
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52633
diff changeset
215 fn test_write_while_borrow() {
52632
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
216 with_setup(|_py, owner| {
52638
ac0cb3c334a1 rust-pyo3-sharedref: renamings in test
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52637
diff changeset
217 let shareable = &owner.borrow().string;
ac0cb3c334a1 rust-pyo3-sharedref: renamings in test
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52637
diff changeset
218 let shared_ref = unsafe { shareable.borrow_with_owner(owner) };
52634
d1e304025b90 rust-pyo3-sharedref: replaced borrow/borrow_mut with RwLock namings
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52633
diff changeset
219 let _ref = shared_ref.read();
52632
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
220
52638
ac0cb3c334a1 rust-pyo3-sharedref: renamings in test
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52637
diff changeset
221 let shared_ref2 = unsafe { shareable.borrow_with_owner(owner) };
52634
d1e304025b90 rust-pyo3-sharedref: replaced borrow/borrow_mut with RwLock namings
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52633
diff changeset
222 let _mut_ref = shared_ref2.write();
52632
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
223 Ok(())
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
224 })
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
225 .expect("should already have panicked")
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
226 }
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
227
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
228 #[test]
52634
d1e304025b90 rust-pyo3-sharedref: replaced borrow/borrow_mut with RwLock namings
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52633
diff changeset
229 fn test_try_borrow_while_write() -> PyResult<()> {
52632
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
230 with_setup(|_py, owner| {
52638
ac0cb3c334a1 rust-pyo3-sharedref: renamings in test
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52637
diff changeset
231 let shareable = &owner.borrow().string;
ac0cb3c334a1 rust-pyo3-sharedref: renamings in test
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52637
diff changeset
232 let shared_ref = unsafe { shareable.borrow_with_owner(owner) };
52634
d1e304025b90 rust-pyo3-sharedref: replaced borrow/borrow_mut with RwLock namings
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52633
diff changeset
233 let _mut_ref = shared_ref.write();
52632
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
234
52634
d1e304025b90 rust-pyo3-sharedref: replaced borrow/borrow_mut with RwLock namings
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52633
diff changeset
235 assert_try_read_string_err(owner);
52632
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
236 Ok(())
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
237 })
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
238 }
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
239
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
240 #[test]
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
241 #[should_panic(expected = "already mutably borrowed")]
52634
d1e304025b90 rust-pyo3-sharedref: replaced borrow/borrow_mut with RwLock namings
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52633
diff changeset
242 fn test_borrow_while_write() {
52632
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
243 with_setup(|_py, owner| {
52638
ac0cb3c334a1 rust-pyo3-sharedref: renamings in test
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52637
diff changeset
244 let shareable = &owner.borrow().string;
ac0cb3c334a1 rust-pyo3-sharedref: renamings in test
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52637
diff changeset
245 let shared_ref = unsafe { shareable.borrow_with_owner(owner) };
52634
d1e304025b90 rust-pyo3-sharedref: replaced borrow/borrow_mut with RwLock namings
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52633
diff changeset
246 let _mut_ref = shared_ref.write();
52632
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
247
52638
ac0cb3c334a1 rust-pyo3-sharedref: renamings in test
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52637
diff changeset
248 let shared_ref2 = unsafe { shareable.borrow_with_owner(owner) };
52634
d1e304025b90 rust-pyo3-sharedref: replaced borrow/borrow_mut with RwLock namings
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52633
diff changeset
249 let _ref = shared_ref2.read();
52632
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
250 Ok(())
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
251 })
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
252 .expect("should already have panicked")
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
253 }