Add waiter to fut_awaited_by with single-object optimization
(&self, waiter: PyObjectRef, vm: &VirtualMachine)
| 721 | |
| 722 | /// Add waiter to fut_awaited_by with single-object optimization |
| 723 | fn awaited_by_add(&self, waiter: PyObjectRef, vm: &VirtualMachine) -> PyResult<()> { |
| 724 | let mut awaited_by = self.fut_awaited_by.write(); |
| 725 | if awaited_by.is_none() { |
| 726 | // First waiter - store directly |
| 727 | *awaited_by = Some(waiter); |
| 728 | return Ok(()); |
| 729 | } |
| 730 | |
| 731 | if self.fut_awaited_by_is_set.load(Ordering::Relaxed) { |
| 732 | // Already a Set - add to it |
| 733 | let set = awaited_by.as_ref().unwrap(); |
| 734 | vm.call_method(set, "add", (waiter,))?; |
| 735 | } else { |
| 736 | // Single object - convert to Set |
| 737 | let existing = awaited_by.take().unwrap(); |
| 738 | let new_set = PySet::default().into_ref(&vm.ctx); |
| 739 | new_set.add(existing, vm)?; |
| 740 | new_set.add(waiter, vm)?; |
| 741 | *awaited_by = Some(new_set.into()); |
| 742 | self.fut_awaited_by_is_set.store(true, Ordering::Relaxed); |
| 743 | } |
| 744 | Ok(()) |
| 745 | } |
| 746 | |
| 747 | /// Discard waiter from fut_awaited_by with single-object optimization |
| 748 | fn awaited_by_discard(&self, waiter: &PyObject, vm: &VirtualMachine) -> PyResult<()> { |