1
0
Fork 0
forked from AbleOS/ableos
ableos-idl/ableos/src/kernel_state.rs

89 lines
2.3 KiB
Rust
Raw Normal View History

2022-08-04 05:19:05 -05:00
use alloc::sync::Arc;
use hashbrown::HashMap;
use spin::Lazy;
2022-01-13 08:54:33 -06:00
use crate::{
2022-08-04 05:19:05 -05:00
filesystem::{StorageDevice, FsNode},
handle::{Handle, HandleResource},
};
pub static KERNEL_STATE: Lazy<spin::Mutex<KernelInternalState>> =
Lazy::new(|| spin::Mutex::new(KernelInternalState::new()));
2022-01-13 08:54:33 -06:00
pub struct KernelInternalState {
2022-02-19 07:17:44 -06:00
pub hostname: String,
storage_devices: HashMap<Handle, Box<dyn StorageDevice>>,
2022-08-04 05:19:05 -05:00
// FIXME: should this be per-process?
file_table: HashMap<Handle, FileTableEntry>,
2022-01-13 08:54:33 -06:00
should_shutdown: bool,
}
impl KernelInternalState {
pub fn new() -> Self {
Self {
should_shutdown: false,
storage_devices: HashMap::new(),
2022-08-04 05:19:05 -05:00
file_table: HashMap::new(),
2022-01-27 01:37:12 -06:00
hostname: "".to_string(),
2022-01-13 08:54:33 -06:00
}
}
2022-01-27 01:37:12 -06:00
pub fn set_hostname(&mut self, hostname: String) {
self.hostname = hostname;
}
pub fn add_storage_device(&mut self, device: impl StorageDevice + Send + 'static) -> Handle {
let handle = Handle::new(HandleResource::StorageDevice);
self.storage_devices.insert(handle, Box::new(device));
handle
}
pub fn get_storage_device(&self, handle: Handle) -> Option<&dyn StorageDevice> {
self.storage_devices.get(&handle).map(|d| &**d)
}
2022-08-04 05:19:05 -05:00
// TODO: implement flags here
pub fn open_file_descriptor(&mut self, fs_node: Arc<FsNode>) -> Handle {
let handle = Handle::new(HandleResource::FileDescriptor);
2022-08-04 05:19:05 -05:00
self.file_table.insert(handle, FileTableEntry::new(fs_node));
handle
}
2022-08-04 05:19:05 -05:00
pub fn get_file_descriptor(&self, handle: Handle) -> Option<&FileTableEntry> {
self.file_table.get(&handle)
}
pub fn close_file_descriptor(&mut self, handle: Handle) {
self.file_table.remove(&handle);
}
2022-01-13 08:54:33 -06:00
pub fn shutdown(&mut self) {
self.should_shutdown = true;
}
2022-01-13 08:54:33 -06:00
pub fn update_state(&mut self) {
if self.should_shutdown {
crate::arch::shutdown();
}
}
}
impl Default for KernelInternalState {
fn default() -> Self {
Self::new()
}
}
2022-08-04 05:19:05 -05:00
pub struct FileTableEntry {
fs_node: Arc<FsNode>,
// TODO: permissions, flags, owner, maybe cache stuff here?
}
impl FileTableEntry {
fn new(fs_node: Arc<FsNode>) -> Self {
Self {
fs_node
}
}
}