Eager start: run first step synchronously
(zelf: &PyRef<PyTask>, vm: &VirtualMachine)
| 1948 | |
| 1949 | /// Eager start: run first step synchronously |
| 1950 | fn task_eager_start(zelf: &PyRef<PyTask>, vm: &VirtualMachine) -> PyResult<()> { |
| 1951 | let loop_obj = zelf.base.fut_loop.read().clone(); |
| 1952 | let loop_obj = match loop_obj { |
| 1953 | Some(l) => l, |
| 1954 | None => return Err(vm.new_runtime_error("Task has no loop")), |
| 1955 | }; |
| 1956 | |
| 1957 | // Register task before running step |
| 1958 | let task_obj: PyObjectRef = zelf.clone().into(); |
| 1959 | _register_task(task_obj.clone(), vm)?; |
| 1960 | |
| 1961 | // Register as eager task |
| 1962 | _register_eager_task(task_obj.clone(), vm)?; |
| 1963 | |
| 1964 | // Swap current task - save previous task |
| 1965 | let prev_task = _swap_current_task(loop_obj.clone(), task_obj.clone(), vm)?; |
| 1966 | |
| 1967 | // Get coro and context |
| 1968 | let coro = zelf.task_coro.read().clone(); |
| 1969 | let context = zelf.task_context.read().clone(); |
| 1970 | |
| 1971 | // Run the first step with context (using context.run(callable, *args)) |
| 1972 | let step_result = if let Some(ctx) = context { |
| 1973 | // Call context.run(coro.send, None) |
| 1974 | let coro_ref = match coro { |
| 1975 | Some(c) => c, |
| 1976 | None => { |
| 1977 | let _ = _swap_current_task(loop_obj.clone(), prev_task, vm); |
| 1978 | _unregister_eager_task(task_obj.clone(), vm)?; |
| 1979 | return Ok(()); |
| 1980 | } |
| 1981 | }; |
| 1982 | let send_method = coro_ref.get_attr(vm.ctx.intern_str("send"), vm)?; |
| 1983 | vm.call_method(&ctx, "run", (send_method, vm.ctx.none())) |
| 1984 | } else { |
| 1985 | // Run without context |
| 1986 | match coro { |
| 1987 | Some(c) => vm.call_method(&c, "send", (vm.ctx.none(),)), |
| 1988 | None => { |
| 1989 | let _ = _swap_current_task(loop_obj.clone(), prev_task, vm); |
| 1990 | _unregister_eager_task(task_obj.clone(), vm)?; |
| 1991 | return Ok(()); |
| 1992 | } |
| 1993 | } |
| 1994 | }; |
| 1995 | |
| 1996 | // Restore previous task |
| 1997 | let _ = _swap_current_task(loop_obj.clone(), prev_task, vm); |
| 1998 | |
| 1999 | // Unregister from eager tasks |
| 2000 | _unregister_eager_task(task_obj.clone(), vm)?; |
| 2001 | |
| 2002 | // Handle the result |
| 2003 | match step_result { |
| 2004 | Ok(result) => { |
| 2005 | task_step_handle_result(zelf, result, vm)?; |
| 2006 | } |
| 2007 | Err(e) => { |
no test coverage detected