pub mod config;
pub(crate) mod file_mapping;
pub(crate) mod host_funcs;
pub mod initialized_multi_use;
pub(crate) mod outb;
pub mod uninitialized;
pub(crate) mod uninitialized_evolve;
pub mod snapshot;
mod callable;
#[cfg(feature = "trace_guest")]
pub(crate) mod trace;
pub use callable::Callable;
pub use config::SandboxConfiguration;
pub use initialized_multi_use::MultiUseSandbox;
pub use uninitialized::GuestBinary;
pub use uninitialized::UninitializedSandbox;
#[cfg(test)]
mod tests {
use std::sync::Arc;
use std::thread;
use crossbeam_queue::ArrayQueue;
use hyperlight_testing::simple_guest_as_string;
use crate::sandbox::uninitialized::GuestBinary;
use crate::{MultiUseSandbox, UninitializedSandbox, new_error};
#[test]
fn check_create_and_use_sandbox_on_different_threads() {
let unintializedsandbox_queue = Arc::new(ArrayQueue::<UninitializedSandbox>::new(10));
let sandbox_queue = Arc::new(ArrayQueue::<MultiUseSandbox>::new(10));
for i in 0..10 {
let simple_guest_path = simple_guest_as_string().expect("Guest Binary Missing");
let unintializedsandbox =
UninitializedSandbox::new(GuestBinary::FilePath(simple_guest_path), None)
.unwrap_or_else(|_| panic!("Failed to create UninitializedSandbox {}", i));
unintializedsandbox_queue
.push(unintializedsandbox)
.unwrap_or_else(|_| panic!("Failed to push UninitializedSandbox {}", i));
}
let thread_handles = (0..10)
.map(|i| {
let uq = unintializedsandbox_queue.clone();
let sq = sandbox_queue.clone();
thread::spawn(move || {
let uninitialized_sandbox = uq.pop().unwrap_or_else(|| {
panic!("Failed to pop UninitializedSandbox thread {}", i)
});
let host_funcs = uninitialized_sandbox
.host_funcs
.try_lock()
.map_err(|_| new_error!("Error locking"));
assert!(host_funcs.is_ok());
host_funcs
.unwrap()
.host_print(format!(
"Printing from UninitializedSandbox on Thread {}\n",
i
))
.unwrap();
let sandbox = uninitialized_sandbox.evolve().unwrap_or_else(|_| {
panic!("Failed to initialize UninitializedSandbox thread {}", i)
});
sq.push(sandbox).unwrap_or_else(|_| {
panic!("Failed to push UninitializedSandbox thread {}", i)
})
})
})
.collect::<Vec<_>>();
for handle in thread_handles {
handle.join().unwrap();
}
let thread_handles = (0..10)
.map(|i| {
let sq = sandbox_queue.clone();
thread::spawn(move || {
let sandbox = sq
.pop()
.unwrap_or_else(|| panic!("Failed to pop Sandbox thread {}", i));
let host_funcs = sandbox
.host_funcs
.try_lock()
.map_err(|_| new_error!("Error locking"));
assert!(host_funcs.is_ok());
host_funcs
.unwrap()
.host_print(format!("Print from Sandbox on Thread {}\n", i))
.unwrap();
})
})
.collect::<Vec<_>>();
for handle in thread_handles {
handle.join().unwrap();
}
}
}