_PyWeakref_GET_REF: attempt to upgrade the weakref to a strong reference.
(&self)
| 827 | impl PyWeak { |
| 828 | /// _PyWeakref_GET_REF: attempt to upgrade the weakref to a strong reference. |
| 829 | pub(crate) fn upgrade(&self) -> Option<PyObjectRef> { |
| 830 | let obj_ptr = self.wr_object.load(Ordering::Acquire); |
| 831 | if obj_ptr.is_null() { |
| 832 | return None; |
| 833 | } |
| 834 | |
| 835 | let _lock = weakref_lock::lock(obj_ptr as usize); |
| 836 | |
| 837 | // Double-check under lock (clear may have run between our check and lock) |
| 838 | let obj_ptr = self.wr_object.load(Ordering::Relaxed); |
| 839 | if obj_ptr.is_null() { |
| 840 | return None; |
| 841 | } |
| 842 | |
| 843 | unsafe { |
| 844 | if !(*obj_ptr).0.ref_count.safe_inc() { |
| 845 | return None; |
| 846 | } |
| 847 | Some(PyObjectRef::from_raw(NonNull::new_unchecked(obj_ptr))) |
| 848 | } |
| 849 | } |
| 850 | |
| 851 | pub(crate) fn is_dead(&self) -> bool { |
| 852 | self.wr_object.load(Ordering::Acquire).is_null() |
no test coverage detected