1
0
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:
zahash 2024-07-23 17:27:29 +05:30 committed by GitHub
parent cb394e9fc2
commit 1615b1754f
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
5 changed files with 8 additions and 25 deletions

@ -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