Begin mailbox implementation

This commit adds the data structures for the mail messaging system
This commit is contained in:
cosineblast
2025-03-04 11:31:37 -03:00
parent bffa9d3278
commit 3ed97e68dc
4 changed files with 177 additions and 21 deletions

View File

@ -37,11 +37,7 @@ was instead spawned by main nushell execution thread."
) -> Result<PipelineData, ShellError> {
let head = call.head;
if let Some((id, _)) = &engine_state.thread_job_entry {
Ok(Value::int(id.get() as i64, head).into_pipeline_data())
} else {
Ok(Value::int(0, head).into_pipeline_data())
}
Ok(Value::int(engine_state.current_job.id.get() as i64, head).into_pipeline_data())
}
fn examples(&self) -> Vec<Example> {

View File

@ -1,15 +1,15 @@
use std::{
sync::{
atomic::{AtomicBool, AtomicU32},
Arc,
mpsc, Arc, Mutex,
},
thread,
};
use nu_engine::{command_prelude::*, ClosureEvalOnce};
use nu_protocol::{
engine::{Closure, Job, Redirection, ThreadJob},
report_shell_error, OutDest, Signals,
engine::{Closure, CurrentJob, Redirection, Job, Mailbox, ThreadJob},
report_shell_error, OutDest, Signals,
};
#[derive(Clone)]
@ -50,11 +50,11 @@ impl Command for JobSpawn {
let closure: Closure = call.req(engine_state, stack, 0)?;
let job_stack = stack.clone();
let mut job_state = engine_state.clone();
job_state.is_interactive = false;
let job_stack = stack.clone();
// the new job should have its ctrl-c independent of foreground
let job_signals = Signals::new(Arc::new(AtomicBool::new(false)));
job_state.set_signals(job_signals.clone());
@ -67,11 +67,18 @@ impl Command for JobSpawn {
let jobs = job_state.jobs.clone();
let mut jobs = jobs.lock().expect("jobs lock is poisoned!");
let (send, recv) = mpsc::channel();
let id = {
let thread_job = ThreadJob::new(job_signals);
let thread_job = ThreadJob::new(job_signals, send);
let id = jobs.add_job(Job::Thread(thread_job.clone()));
job_state.thread_job_entry = Some((id, thread_job));
job_state.current_job = CurrentJob {
id,
background_thread_job: Some(thread_job),
mailbox: Arc::new(Mutex::new(Mailbox::new(recv))),
};
id
};