Added sc_v call

This commit is contained in:
François Autin
2023-04-12 13:25:33 +02:00
parent afce2c66c9
commit 729eba656c
2 changed files with 45 additions and 21 deletions

View File

@ -4,12 +4,7 @@
use std::collections::HashMap;
/// This trait allows ObjAddr to hold references to Multiple kinds of structs
///
/// - Lock
/// - Condition
/// - Sémaphore
pub trait SynchObj { }
use crate::kernel::synch::{ Semaphore, Lock };
/// Brief Definition of object identifiers:
///
@ -20,36 +15,55 @@ pub trait SynchObj { }
/// A method allows to detect of an object corresponding to a given
/// identifier exists; this is used to check the parameters of system
/// calls.
pub struct ObjAddr<'a> {
pub struct ObjAddr {
last_id: i32,
map: HashMap<i32, &'a dyn SynchObj>
semaphores: HashMap<i32, Semaphore>,
locks: HashMap<i32, Lock>
}
impl<'a> ObjAddr<'a> {
impl ObjAddr {
/// Initializes and returns a ObjAddr struct
pub fn init() -> Self {
Self {
last_id: 3,
map: HashMap::<i32, &dyn SynchObj>::new()
semaphores: HashMap::<i32, Semaphore>::new(),
locks: HashMap::<i32, Lock>::new()
}
}
/// Adds the **obj** SynchObj to self
pub fn add_object(&mut self, obj: &'a dyn SynchObj) -> i32 {
/// Adds the **obj** Semaphore to self
pub fn add_semaphore(&mut self, obj: Semaphore) -> i32 {
self.last_id = self.last_id + 1;
self.map.insert(self.last_id, obj);
self.semaphores.insert(self.last_id, obj);
self.last_id
}
/// Searches for an object of id **id** in self
pub fn search_object(&self, id: i32) -> Option<&& dyn SynchObj> {
self.map.get(&id)
/// Adds the **obj** Lock to self
pub fn add_lock(&mut self, obj: Lock) -> i32 {
self.last_id = self.last_id + 1;
self.locks.insert(self.last_id, obj);
self.last_id
}
/// Searches for a semaphore of id **id** in self
pub fn search_semaphore(&self, id: i32) -> Option<&mut Semaphore> {
self.semaphores.get(&id)
}
/// Searches for a lock of id **id** in self
pub fn search_lock(&self, id:i32) -> Option<&mut Lock> {
self.locks.get(&id)
}
/// Removes the object of id **id** from self if it exists
pub fn remove_object_from_key(&mut self, id: i32) {
self.map.remove(&id);
pub fn remove_semaphore(&mut self, id: i32) {
self.semaphores.remove(&id)
}
pub fn remove_semaphore(&mut self, id:i32) {
self.locks.remove(&id)
}
}