Mercurial > public > mercurial-scm > hg-stable
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 |
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 } |