mirror of
https://github.com/containers/youki
synced 2024-11-26 06:08:07 +01:00
initial progress on supporting OwnedFd (#2809)
This commit is contained in:
parent
cb394e9fc2
commit
1615b1754f
@ -16,13 +16,11 @@ pub enum ChannelError {
|
||||
#[error("channel connection broken")]
|
||||
BrokenChannel,
|
||||
}
|
||||
#[derive(Clone)]
|
||||
pub struct Receiver<T> {
|
||||
receiver: RawFd,
|
||||
phantom: PhantomData<T>,
|
||||
}
|
||||
|
||||
#[derive(Clone)]
|
||||
pub struct Sender<T> {
|
||||
sender: RawFd,
|
||||
phantom: PhantomData<T>,
|
||||
|
@ -44,7 +44,6 @@ pub fn main_channel() -> Result<(MainSender, MainReceiver), ChannelError> {
|
||||
Ok((MainSender { sender }, MainReceiver { receiver }))
|
||||
}
|
||||
|
||||
#[derive(Clone)]
|
||||
pub struct MainSender {
|
||||
sender: Sender<Message>,
|
||||
}
|
||||
@ -97,7 +96,6 @@ impl MainSender {
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Clone)]
|
||||
pub struct MainReceiver {
|
||||
receiver: Receiver<Message>,
|
||||
}
|
||||
@ -209,7 +207,6 @@ pub fn intermediate_channel() -> Result<(IntermediateSender, IntermediateReceive
|
||||
))
|
||||
}
|
||||
|
||||
#[derive(Clone)]
|
||||
pub struct IntermediateSender {
|
||||
sender: Sender<Message>,
|
||||
}
|
||||
@ -229,7 +226,6 @@ impl IntermediateSender {
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Clone)]
|
||||
pub struct IntermediateReceiver {
|
||||
receiver: Receiver<Message>,
|
||||
}
|
||||
@ -266,7 +262,6 @@ pub fn init_channel() -> Result<(InitSender, InitReceiver), ChannelError> {
|
||||
Ok((InitSender { sender }, InitReceiver { receiver }))
|
||||
}
|
||||
|
||||
#[derive(Clone)]
|
||||
pub struct InitSender {
|
||||
sender: Sender<Message>,
|
||||
}
|
||||
@ -285,7 +280,6 @@ impl InitSender {
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Clone)]
|
||||
pub struct InitReceiver {
|
||||
receiver: Receiver<Message>,
|
||||
}
|
||||
|
@ -101,12 +101,7 @@ pub fn container_intermediate_process(
|
||||
}
|
||||
|
||||
let cb: CloneCb = {
|
||||
let args = args.clone();
|
||||
let init_sender = init_sender.clone();
|
||||
let inter_sender = inter_sender.clone();
|
||||
let mut main_sender = main_sender.clone();
|
||||
let mut init_receiver = init_receiver.clone();
|
||||
Box::new(move || {
|
||||
Box::new(|| {
|
||||
if let Err(ret) = prctl::set_name("youki:[2:INIT]") {
|
||||
tracing::error!(?ret, "failed to set name for child process");
|
||||
return ret;
|
||||
@ -123,7 +118,7 @@ pub fn container_intermediate_process(
|
||||
tracing::error!(?err, "failed to close sender in the intermediate process");
|
||||
return -1;
|
||||
}
|
||||
match container_init_process(&args, &mut main_sender, &mut init_receiver) {
|
||||
match container_init_process(args, main_sender, init_receiver) {
|
||||
Ok(_) => 0,
|
||||
Err(e) => {
|
||||
tracing::error!("failed to initialize container process: {e}");
|
||||
|
@ -39,23 +39,19 @@ pub fn container_main_process(container_args: &ContainerArgs) -> Result<(Pid, bo
|
||||
// cloned process, we have to be deligent about closing any unused channel.
|
||||
// At minimum, we have to close down any unused senders. The corresponding
|
||||
// receivers will be cleaned up once the senders are closed down.
|
||||
let (main_sender, mut main_receiver) = channel::main_channel()?;
|
||||
let inter_chan = channel::intermediate_channel()?;
|
||||
let init_chan = channel::init_channel()?;
|
||||
let (mut main_sender, mut main_receiver) = channel::main_channel()?;
|
||||
let mut inter_chan = channel::intermediate_channel()?;
|
||||
let mut init_chan = channel::init_channel()?;
|
||||
|
||||
let cb: CloneCb = {
|
||||
let container_args = container_args.clone();
|
||||
let mut main_sender = main_sender.clone();
|
||||
let mut inter_chan = inter_chan.clone();
|
||||
let mut init_chan = init_chan.clone();
|
||||
Box::new(move || {
|
||||
Box::new(|| {
|
||||
if let Err(ret) = prctl::set_name("youki:[1:INTER]") {
|
||||
tracing::error!(?ret, "failed to set name for child process");
|
||||
return ret;
|
||||
}
|
||||
|
||||
match container_intermediate_process::container_intermediate_process(
|
||||
&container_args,
|
||||
container_args,
|
||||
&mut inter_chan,
|
||||
&mut init_chan,
|
||||
&mut main_sender,
|
||||
|
@ -32,7 +32,7 @@ pub enum CloneError {
|
||||
/// pass in a child stack, which is empty. By storing the closure in heap, we
|
||||
/// can then in the new process to re-box the heap memory back to a closure
|
||||
/// correctly.
|
||||
pub type CloneCb = Box<dyn FnMut() -> i32>;
|
||||
pub type CloneCb<'a> = Box<dyn FnMut() -> i32 + 'a>;
|
||||
|
||||
// Clone a sibling process that shares the same parent as the calling
|
||||
// process. This is used to launch the container init process so the parent
|
||||
|
Loading…
Reference in New Issue
Block a user