(loop_: PyObjectRef, task: PyObjectRef, vm: &VirtualMachine)
| 2528 | |
| 2529 | #[pyfunction] |
| 2530 | fn _swap_current_task(loop_: PyObjectRef, task: PyObjectRef, vm: &VirtualMachine) -> PyResult { |
| 2531 | // Per-thread swap, matching CPython's swap_current_task |
| 2532 | let prev = vm |
| 2533 | .asyncio_running_task |
| 2534 | .borrow() |
| 2535 | .clone() |
| 2536 | .unwrap_or_else(|| vm.ctx.none()); |
| 2537 | |
| 2538 | if vm.is_none(&task) { |
| 2539 | *vm.asyncio_running_task.borrow_mut() = None; |
| 2540 | } else { |
| 2541 | *vm.asyncio_running_task.borrow_mut() = Some(task.clone()); |
| 2542 | } |
| 2543 | |
| 2544 | // Also update the module-level dict for cross-thread queries |
| 2545 | if let Ok(current_tasks) = get_current_tasks_dict(vm) |
| 2546 | && let Ok(dict) = current_tasks.downcast::<rustpython_vm::builtins::PyDict>() |
| 2547 | { |
| 2548 | if vm.is_none(&task) { |
| 2549 | let _ = dict.del_item(&*loop_, vm); |
| 2550 | } else { |
| 2551 | let _ = dict.set_item(&*loop_, task, vm); |
| 2552 | } |
| 2553 | } |
| 2554 | |
| 2555 | Ok(prev) |
| 2556 | } |
| 2557 | |
| 2558 | /// Reset task state after fork in child process. |
| 2559 | #[pyfunction] |
no test coverage detected