Removed Rc<RefCell<Machine>>

This commit is contained in:
François Autin 2023-03-15 14:56:05 +01:00
parent 84d8bcc84f
commit abb97d17d5
No known key found for this signature in database
GPG Key ID: 343F5D382E1DD77C
2 changed files with 14 additions and 14 deletions

View File

@ -35,7 +35,7 @@ macro_rules! init_system {
/// - The scheduler which acts upon these threads /// - The scheduler which acts upon these threads
#[derive(PartialEq)] #[derive(PartialEq)]
pub struct System { pub struct System {
g_machine: RefCell<Machine>, machine: Machine,
thread_manager: Rc<RefCell<ThreadManager>> thread_manager: Rc<RefCell<ThreadManager>>
} }
@ -44,7 +44,7 @@ impl System {
/// System constructor /// System constructor
pub fn new(machine: Machine) -> System { pub fn new(machine: Machine) -> System {
Self { Self {
g_machine: RefCell::new(machine), machine,
thread_manager: Rc::new(RefCell::new(ThreadManager::new())) thread_manager: Rc::new(RefCell::new(ThreadManager::new()))
} }
} }
@ -62,8 +62,8 @@ impl System {
/// Returns the Machine /// Returns the Machine
/// ///
/// Useful to access RAM, devices, ... /// Useful to access RAM, devices, ...
pub fn get_g_machine(&self) -> &RefCell<Machine> { pub fn get_machine(&self) -> Machine {
&self.g_machine self.machine
} }
pub fn get_thread_manager(&self) -> Rc<RefCell<ThreadManager>> { pub fn get_thread_manager(&self) -> Rc<RefCell<ThreadManager>> {
@ -73,8 +73,8 @@ impl System {
// Setters // Setters
/// Assign a machine to the system /// Assign a machine to the system
pub fn set_g_machine(&mut self, machine: RefCell<Machine>) { pub fn set_machine(&mut self, machine: Machine) {
self.g_machine = machine self.machine = machine
} }
} }

View File

@ -69,7 +69,7 @@ impl ThreadManager {
pub fn thread_yield(&mut self, thread: Rc<RefCell<Thread>>) { pub fn thread_yield(&mut self, thread: Rc<RefCell<Thread>>) {
if let Some(system) = &self.system { if let Some(system) = &self.system {
let sys = system.borrow_mut(); let sys = system.borrow_mut();
let mut machine = sys.get_g_machine().borrow_mut(); let mut machine = sys.get_machine();
let old_status = machine.interrupt.set_status(crate::simulator::interrupt::InterruptStatus::InterruptOff); let old_status = machine.interrupt.set_status(crate::simulator::interrupt::InterruptStatus::InterruptOff);
assert_eq!(Option::Some(Rc::clone(&thread)), self.g_current_thread); assert_eq!(Option::Some(Rc::clone(&thread)), self.g_current_thread);
@ -89,7 +89,7 @@ impl ThreadManager {
assert_eq!(Option::Some(Rc::clone(&thread)), self.g_current_thread); assert_eq!(Option::Some(Rc::clone(&thread)), self.g_current_thread);
if let Some(system) = &self.system { if let Some(system) = &self.system {
let sys = system.borrow_mut(); let sys = system.borrow_mut();
let machine = sys.get_g_machine().borrow_mut(); let machine = sys.get_machine();
assert_eq!(machine.interrupt.get_status(), InterruptStatus::InterruptOff); assert_eq!(machine.interrupt.get_status(), InterruptStatus::InterruptOff);
let mut next_thread = self.g_scheduler.find_next_to_run(); let mut next_thread = self.g_scheduler.find_next_to_run();
@ -108,7 +108,7 @@ impl ThreadManager {
if let Some(system) = &self.system { if let Some(system) = &self.system {
let sys = Rc::clone(system); let sys = Rc::clone(system);
let sys = sys.borrow_mut(); let sys = sys.borrow_mut();
let mut machine = sys.get_g_machine().borrow_mut(); let mut machine = sys.get_machine();
let old_status = machine.interrupt.set_status(InterruptStatus::InterruptOff); let old_status = machine.interrupt.set_status(InterruptStatus::InterruptOff);
self.g_thread_to_be_destroyed = Option::Some(Rc::clone(&thread)); self.g_thread_to_be_destroyed = Option::Some(Rc::clone(&thread));
self.g_alive.remove(Rc::clone(&thread)); self.g_alive.remove(Rc::clone(&thread));
@ -121,12 +121,12 @@ impl ThreadManager {
pub fn thread_save_processor_state(&mut self, thread: Rc<RefCell<Thread>>) { pub fn thread_save_processor_state(&mut self, thread: Rc<RefCell<Thread>>) {
if let Some(system) = &self.system { if let Some(system) = &self.system {
let mut t: RefMut<_> = thread.borrow_mut(); let mut t: RefMut<_> = thread.borrow_mut();
let system = system.borrow_mut(); let system = system;
for i in 0..NUM_INT_REGS { for i in 0..NUM_INT_REGS {
t.thread_context.int_registers[i] = system.get_g_machine().borrow().read_int_register(i); t.thread_context.int_registers[i] = system.get_machine().read_int_register(i);
} }
for i in 0..NUM_FP_REGS { for i in 0..NUM_FP_REGS {
t.thread_context.float_registers[i] = system.get_g_machine().borrow().read_fp_register(i); t.thread_context.float_registers[i] = system.get_machine().read_fp_register(i);
} }
} else { } else {
unreachable!("System is None") unreachable!("System is None")
@ -138,8 +138,8 @@ impl ThreadManager {
let system = system.borrow_mut(); let system = system.borrow_mut();
let t: Ref<_> = thread.borrow(); let t: Ref<_> = thread.borrow();
for i in 0..NUM_INT_REGS { for i in 0..NUM_INT_REGS {
let machine = system.get_g_machine(); let machine = system.get_machine();
let mut machine = machine.borrow_mut(); let mut machine = machine;
machine.write_int_register(i, t.thread_context.int_registers[i]); machine.write_int_register(i, t.thread_context.int_registers[i]);
} }
} else { } else {