use alloc::sync::{Arc, Weak};
use std::os::arceos::modules::ax_task::{TaskExt, TaskInner};
use crate::vmm::{VCpuRef, VM, VMRef};
pub struct VCpuTask {
pub vm: Weak<VM>,
pub vcpu: VCpuRef,
}
impl VCpuTask {
pub fn new(vm: &VMRef, vcpu: VCpuRef) -> Self {
Self {
vm: Arc::downgrade(vm),
vcpu,
}
}
pub fn vm(&self) -> VMRef {
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>()
}
}