From bae37aa507bd5a74707ca37d5e0ee6d347dfe1ea Mon Sep 17 00:00:00 2001 From: Garen Tyler Date: Fri, 3 Nov 2023 18:48:55 -0600 Subject: [PATCH] move nextpid into atomic i32 in rust --- kernel/proc.c | 6 +----- kernel/rustkernel/src/proc/proc.rs | 12 ++++++------ 2 files changed, 7 insertions(+), 11 deletions(-) diff --git a/kernel/proc.c b/kernel/proc.c index d4003eb..b1d1a4b 100644 --- a/kernel/proc.c +++ b/kernel/proc.c @@ -10,9 +10,6 @@ struct proc proc[NPROC]; struct proc *initproc; -int nextpid = 1; -struct spinlock pid_lock; - extern void forkret(void); void freeproc(struct proc *p); @@ -46,8 +43,7 @@ void procinit(void) { struct proc *p; - - initlock(&pid_lock, "nextpid"); + initlock(&wait_lock, "wait_lock"); for(p = proc; p < &proc[NPROC]; p++) { initlock(&p->lock, "proc"); diff --git a/kernel/rustkernel/src/proc/proc.rs b/kernel/rustkernel/src/proc/proc.rs index 927ae19..b9a1f68 100644 --- a/kernel/rustkernel/src/proc/proc.rs +++ b/kernel/rustkernel/src/proc/proc.rs @@ -10,6 +10,7 @@ use crate::{ use core::{ ffi::{c_char, c_void}, ptr::{addr_of_mut, null_mut}, + sync::atomic::{AtomicI32, Ordering}, }; extern "C" { @@ -45,6 +46,8 @@ extern "C" { pub fn swtch(a: *mut Context, b: *mut Context); } +pub static NEXT_PID: AtomicI32 = AtomicI32::new(1); + #[repr(C)] #[derive(PartialEq, Default)] pub enum ProcState { @@ -164,7 +167,7 @@ impl Proc { /// Return the current struct proc *, or zero if none. #[no_mangle] -pub unsafe extern "C" fn myproc() -> *mut Proc { +pub extern "C" fn myproc() -> *mut Proc { if let Some(p) = Proc::current() { p as *mut Proc } else { @@ -173,11 +176,8 @@ pub unsafe extern "C" fn myproc() -> *mut Proc { } #[no_mangle] -pub unsafe extern "C" fn allocpid() -> i32 { - let _guard = pid_lock.lock(); - let pid = nextpid; - nextpid += 1; - pid +pub extern "C" fn allocpid() -> i32 { + NEXT_PID.fetch_add(1, Ordering::SeqCst) } /// Free a proc structure and the data hanging from it, including user pages.