Adding some content to thread
This commit is contained in:
parent
792497b14c
commit
77e6d74b3b
@ -1,5 +1,5 @@
|
|||||||
|
|
||||||
#[derive(PartialEq)]
|
#[derive(PartialEq)]
|
||||||
pub struct Process {
|
pub struct Process {
|
||||||
|
pub num_thread: usize,
|
||||||
}
|
}
|
@ -3,7 +3,7 @@ use crate::kernel::thread::Thread;
|
|||||||
use crate::utility::system::{G_CURRENT_THREAD, G_THREAD_TO_BE_DESTROYED};
|
use crate::utility::system::{G_CURRENT_THREAD, G_THREAD_TO_BE_DESTROYED};
|
||||||
|
|
||||||
|
|
||||||
struct Scheduler<> {
|
struct Scheduler {
|
||||||
ready_list: List<Thread>
|
ready_list: List<Thread>
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
use super::process::Process;
|
use super::process::Process;
|
||||||
use crate::{simulator::machine::{NUM_INT_REGS, NUM_FP_REGS}, utility::system::ObjectType};
|
use crate::{simulator::machine::{NUM_INT_REGS, NUM_FP_REGS, STACK_REG}, utility::system::ObjectType};
|
||||||
|
|
||||||
|
const SIMULATORSTACKSIZE: usize = 32 * 1024;
|
||||||
|
|
||||||
#[derive(PartialEq)]
|
#[derive(PartialEq)]
|
||||||
struct SimulatorContext {
|
struct SimulatorContext {
|
||||||
@ -42,10 +43,23 @@ impl Thread {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Start a thread, attaching it to a process
|
/// Start a thread, attaching it to a process
|
||||||
pub fn start(&self, owner: &Process, func: i64, arg: i64) -> i32 {
|
pub fn start(&mut self, owner: Process, func: i64, arg: i64) -> i32 {
|
||||||
|
self.process = Option::Some(owner);
|
||||||
|
let ptr = 0; // todo addrspace
|
||||||
|
self.init_thread_context(func, ptr, arg);
|
||||||
|
let base_stack_addr: [i8; SIMULATORSTACKSIZE] = [0; SIMULATORSTACKSIZE]; // todo AllocBoundedArray
|
||||||
|
self.init_simulator_context(base_stack_addr);
|
||||||
|
self.process.as_mut().unwrap().num_thread += 1;
|
||||||
|
|
||||||
todo!();
|
todo!();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn init_thread_context(&mut self, initial_pc_reg: i64, initial_sp: i64, arg: i64) {
|
||||||
|
self.thread_context.pc = initial_pc_reg;
|
||||||
|
self.thread_context.int_registers[10] = arg;
|
||||||
|
self.thread_context.int_registers[STACK_REG] = initial_sp;
|
||||||
|
}
|
||||||
|
|
||||||
/// Wait for another thread to finish its execution
|
/// Wait for another thread to finish its execution
|
||||||
pub fn join(&self, id_thread: &Thread) {
|
pub fn join(&self, id_thread: &Thread) {
|
||||||
todo!();
|
todo!();
|
||||||
@ -73,7 +87,7 @@ impl Thread {
|
|||||||
todo!();
|
todo!();
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn init_simulator_context(&self, initial_pc_reg: i64, initial_sp: i64, arg: i64) {
|
pub fn init_simulator_context(&self, base_stack_addr: [i8; SIMULATORSTACKSIZE]) {
|
||||||
todo!();
|
todo!();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -98,3 +112,12 @@ impl Thread {
|
|||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl Drop for Thread {
|
||||||
|
|
||||||
|
fn drop(&mut self) {
|
||||||
|
self.object_type = ObjectType::InvalidType;
|
||||||
|
todo!();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -4,6 +4,8 @@ use super::{decode::{Instruction, decode}};
|
|||||||
use super::global::*;
|
use super::global::*;
|
||||||
use std::fs::File;
|
use std::fs::File;
|
||||||
|
|
||||||
|
pub const STACK_REG: usize = 2;
|
||||||
|
|
||||||
pub const NUM_INT_REGS: usize = 32;
|
pub const NUM_INT_REGS: usize = 32;
|
||||||
pub const NUM_FP_REGS: usize = 32;
|
pub const NUM_FP_REGS: usize = 32;
|
||||||
|
|
||||||
|
@ -1,13 +1,16 @@
|
|||||||
use std::sync::{Mutex, RwLock};
|
use std::sync::{RwLock, Arc};
|
||||||
|
|
||||||
use lazy_static::lazy_static;
|
use lazy_static::lazy_static;
|
||||||
|
|
||||||
use crate::kernel::thread::Thread;
|
use crate::kernel::thread::Thread;
|
||||||
|
|
||||||
|
use super::list::List;
|
||||||
extern crate lazy_static;
|
extern crate lazy_static;
|
||||||
|
|
||||||
lazy_static! {
|
lazy_static! {
|
||||||
pub static ref G_CURRENT_THREAD: RwLock<Option<Thread>> = RwLock::new(Option::None);
|
pub static ref G_CURRENT_THREAD: RwLock<Option<Thread>> = RwLock::new(Option::None);
|
||||||
pub static ref G_THREAD_TO_BE_DESTROYED: RwLock<Option<Thread>> = RwLock::new(Option::None);
|
pub static ref G_THREAD_TO_BE_DESTROYED: RwLock<Option<Thread>> = RwLock::new(Option::None);
|
||||||
|
// pub static ref G_ALIVE: Arc<RwLock<List<Thread>>> = Arc::new(RwLock::new(List::new()));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user