This commit is contained in:
parent
f4c82ada2e
commit
2eb64bbdc0
@ -262,6 +262,7 @@ pub enum Request {
|
|||||||
CancelSectionRunId(sections::CancelSectionRunIdRequest),
|
CancelSectionRunId(sections::CancelSectionRunIdRequest),
|
||||||
PauseSectionRunner(sections::PauseSectionRunnerRequest),
|
PauseSectionRunner(sections::PauseSectionRunnerRequest),
|
||||||
RunProgram(programs::RunProgramRequest),
|
RunProgram(programs::RunProgramRequest),
|
||||||
|
CancelProgram(programs::CancelProgramRequest),
|
||||||
}
|
}
|
||||||
|
|
||||||
impl IRequest for Request {
|
impl IRequest for Request {
|
||||||
@ -274,6 +275,7 @@ impl IRequest for Request {
|
|||||||
Request::CancelSectionRunId(req) => req.exec_erased(ctx),
|
Request::CancelSectionRunId(req) => req.exec_erased(ctx),
|
||||||
Request::PauseSectionRunner(req) => req.exec_erased(ctx),
|
Request::PauseSectionRunner(req) => req.exec_erased(ctx),
|
||||||
Request::RunProgram(req) => req.exec_erased(ctx),
|
Request::RunProgram(req) => req.exec_erased(ctx),
|
||||||
|
Request::CancelProgram(req) => req.exec_erased(ctx),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -30,3 +30,35 @@ impl IRequest for RunProgramRequest {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Serialize, Deserialize)]
|
||||||
|
#[serde(rename_all = "camelCase")]
|
||||||
|
pub struct CancelProgramRequest {
|
||||||
|
program_id: ProgramId,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl IRequest for CancelProgramRequest {
|
||||||
|
type Response = ResponseMessage;
|
||||||
|
|
||||||
|
fn exec(&mut self, ctx: &mut RequestContext) -> RequestFuture<Self::Response> {
|
||||||
|
let mut program_runner = ctx.program_runner.clone();
|
||||||
|
let program_id = self.program_id;
|
||||||
|
Box::pin(async move {
|
||||||
|
let cancelled = program_runner
|
||||||
|
.cancel_program(program_id)
|
||||||
|
.await
|
||||||
|
.wrap_err("could not run cancel program")?;
|
||||||
|
match cancelled {
|
||||||
|
Some(program) => Ok(ResponseMessage::new(format!(
|
||||||
|
"program '{}' cancelled",
|
||||||
|
program.name
|
||||||
|
))),
|
||||||
|
None => Err(RequestError::with_name(
|
||||||
|
ErrorCode::NoSuchProgram,
|
||||||
|
"program was not running",
|
||||||
|
"program",
|
||||||
|
)),
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -297,19 +297,22 @@ impl Handler<RunProgram> for ProgramRunnerActor {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Message)]
|
#[derive(Message)]
|
||||||
#[rtype(result = "()")]
|
#[rtype(result = "Option<ProgramRef>")]
|
||||||
struct CancelProgram(ProgramId);
|
struct CancelProgram(ProgramId);
|
||||||
|
|
||||||
impl Handler<CancelProgram> for ProgramRunnerActor {
|
impl Handler<CancelProgram> for ProgramRunnerActor {
|
||||||
type Result = ();
|
type Result = Option<ProgramRef>;
|
||||||
fn handle(&mut self, msg: CancelProgram, ctx: &mut Self::Context) -> Self::Result {
|
fn handle(&mut self, msg: CancelProgram, ctx: &mut Self::Context) -> Self::Result {
|
||||||
let CancelProgram(program_id) = msg;
|
let CancelProgram(program_id) = msg;
|
||||||
|
let mut cancelled = None;
|
||||||
for run in self.run_queue.iter_mut() {
|
for run in self.run_queue.iter_mut() {
|
||||||
if run.program.id == program_id {
|
if run.program.id == program_id {
|
||||||
run.state = RunState::Cancelled;
|
run.state = RunState::Cancelled;
|
||||||
|
cancelled = Some(run.program.clone());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ctx.notify(Process);
|
ctx.notify(Process);
|
||||||
|
cancelled
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -448,7 +451,7 @@ impl ProgramRunner {
|
|||||||
.map_err(ProgramRunnerError::from)
|
.map_err(ProgramRunnerError::from)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub async fn cancel_program(&mut self, program_id: ProgramId) -> Result<()> {
|
pub async fn cancel_program(&mut self, program_id: ProgramId) -> Result<Option<ProgramRef>> {
|
||||||
self.addr
|
self.addr
|
||||||
.send(CancelProgram(program_id))
|
.send(CancelProgram(program_id))
|
||||||
.await
|
.await
|
||||||
|
Loading…
x
Reference in New Issue
Block a user