extern crate alloc;
use alloc::sync::{Arc, Weak};
use crate::{
AxVCpuRef,
host::task::{TaskExt, TaskInner},
vm::AxVMRef,
};
pub struct VCpuTask {
pub vm: Weak<crate::AxVM>,
pub vcpu: AxVCpuRef,
}
impl VCpuTask {
pub fn new(vm: &AxVMRef, vcpu: AxVCpuRef) -> Self {
Self {
vm: Arc::downgrade(vm),
vcpu,
}
}
pub fn vm(&self) -> AxVMRef {
self.vm.upgrade().expect("VM has been dropped")
}
}
#[extern_trait::extern_trait]
impl TaskExt for VCpuTask {}
pub trait AsVCpuTask {
fn as_vcpu_task(&self) -> &VCpuTask;
}
impl AsVCpuTask for TaskInner {
fn as_vcpu_task(&self) -> &VCpuTask {
self.task_ext()
.expect("Not a VCpuTask")
.downcast_ref::<VCpuTask>()
}
}