swactor/crates/process/src/spawn.rs

37 lines
1.1 KiB
Rust
Raw Normal View History

use std::sync::{Arc, OnceLock};
use swactor::Error;
use swactor::actor::{ActorAddress, Ctx};
use swactor::runtime::ExternalSender;
use crate::actor::ProcessActor;
2026-07-18 11:21:34 +00:00
use crate::lifecycle::{ProcessOutputConfig, prepare_process_output};
use crate::message::{ProcessActorCommand, ProcessCommand};
use crate::types::ProcessSpec;
2026-07-18 11:21:34 +00:00
/// Spawn a process actor using the OS subprocess supervisor.
pub fn spawn_local_process(
ctx: &Ctx,
sender: &ExternalSender,
spec: ProcessSpec,
2026-07-18 11:21:34 +00:00
output: ProcessOutputConfig,
) -> Result<ActorAddress, Error> {
2026-07-18 11:21:34 +00:00
let prepared_output = prepare_process_output(&spec, output)?;
let addr_slot = Arc::new(OnceLock::new());
let actor = ProcessActor::new(spec, prepared_output, sender.clone(), addr_slot.clone());
let addr = ctx.spawn(actor)?;
addr_slot
.set(addr)
.expect("process actor address already set");
let _ = sender.send_to(addr, ProcessActorCommand::SupervisorWake);
Ok(addr)
2026-06-06 17:53:25 +00:00
}
2026-07-18 11:21:34 +00:00
pub fn send_process_command(
sender: &ExternalSender,
2026-07-18 11:21:34 +00:00
process: ActorAddress,
command: ProcessCommand,
) -> Result<(), Error> {
sender.send_to(process, ProcessActorCommand::Command(command))
}