Refine System-V shared memory
This commit is contained in:
parent
d49b3af0aa
commit
50e4653e12
@ -3,5 +3,5 @@ use super::*;
|
||||
mod shm;
|
||||
mod syscalls;
|
||||
|
||||
pub use self::shm::{key_t, shmids_t, SHM_MANAGER};
|
||||
pub use self::shm::{key_t, shmids_t, SYSTEM_V_SHM_MANAGER};
|
||||
pub use self::syscalls::{do_shmat, do_shmctl, do_shmdt, do_shmget};
|
||||
|
@ -144,7 +144,6 @@ impl ShmSegment {
|
||||
.size(size)
|
||||
// Currently, Occlum only support shared memory segment with rw permission
|
||||
.perms(VMPerms::READ | VMPerms::WRITE)
|
||||
.initializer(VMInitializer::FillZeros())
|
||||
.build()?;
|
||||
let chunk = USER_SPACE_VM_MANAGER.internal().mmap_chunk(&vm_option)?;
|
||||
|
||||
@ -204,6 +203,14 @@ impl ShmSegment {
|
||||
self.process_set.remove(&pid);
|
||||
Ok(())
|
||||
}
|
||||
|
||||
fn chunk(&self) -> &ChunkRef {
|
||||
&self.chunk
|
||||
}
|
||||
|
||||
fn process_set(&self) -> &HashSet<pid_t> {
|
||||
&self.process_set
|
||||
}
|
||||
}
|
||||
|
||||
impl Drop for ShmSegment {
|
||||
@ -265,7 +272,7 @@ impl ShmIdManager {
|
||||
}
|
||||
|
||||
lazy_static! {
|
||||
pub static ref SHM_MANAGER: ShmManager = ShmManager::new();
|
||||
pub static ref SYSTEM_V_SHM_MANAGER: ShmManager = ShmManager::new();
|
||||
}
|
||||
|
||||
#[derive(Debug)]
|
||||
@ -282,6 +289,16 @@ impl ShmManager {
|
||||
}
|
||||
}
|
||||
|
||||
pub fn get_shm_chunk_containing_addr(&self, addr: usize, pid: pid_t) -> Option<ChunkRef> {
|
||||
let shm_segments = self.shm_segments.read().unwrap();
|
||||
shm_segments
|
||||
.iter()
|
||||
.find(|(_, shm_segment)| {
|
||||
shm_segment.chunk().range().contains(addr) && shm_segment.process_set.contains(&pid)
|
||||
})
|
||||
.map(|(_, shm_segment)| shm_segment.chunk().clone())
|
||||
}
|
||||
|
||||
fn current_time() -> time_t {
|
||||
do_gettimeofday().sec()
|
||||
}
|
||||
|
@ -2,24 +2,24 @@ use super::*;
|
||||
|
||||
use util::mem_util::from_user;
|
||||
|
||||
use super::shm::{shmids_t, CmdId, ShmFlags, ShmId, SHM_MANAGER};
|
||||
use super::shm::{shmids_t, CmdId, ShmFlags, ShmId, SYSTEM_V_SHM_MANAGER};
|
||||
|
||||
pub fn do_shmget(key: key_t, size: size_t, shmflg: i32) -> Result<isize> {
|
||||
let shmflg =
|
||||
ShmFlags::from_bits(shmflg as u32).ok_or_else(|| errno!(EINVAL, "invalid flags"))?;
|
||||
let shmid = SHM_MANAGER.do_shmget(key, size, shmflg)?;
|
||||
let shmid = SYSTEM_V_SHM_MANAGER.do_shmget(key, size, shmflg)?;
|
||||
Ok(shmid as isize)
|
||||
}
|
||||
|
||||
pub fn do_shmat(shmid: i32, shmaddr: usize, shmflg: i32) -> Result<isize> {
|
||||
let shmflg =
|
||||
ShmFlags::from_bits(shmflg as u32).ok_or_else(|| errno!(EINVAL, "invalid flags"))?;
|
||||
let addr = SHM_MANAGER.do_shmat(shmid as ShmId, shmaddr, shmflg)?;
|
||||
let addr = SYSTEM_V_SHM_MANAGER.do_shmat(shmid as ShmId, shmaddr, shmflg)?;
|
||||
Ok(addr as isize)
|
||||
}
|
||||
|
||||
pub fn do_shmdt(shmaddr: usize) -> Result<isize> {
|
||||
SHM_MANAGER.do_shmdt(shmaddr)?;
|
||||
SYSTEM_V_SHM_MANAGER.do_shmdt(shmaddr)?;
|
||||
Ok(0)
|
||||
}
|
||||
|
||||
@ -31,6 +31,6 @@ pub fn do_shmctl(shmid: i32, cmd: i32, buf_u: *mut shmids_t) -> Result<isize> {
|
||||
} else {
|
||||
None
|
||||
};
|
||||
SHM_MANAGER.do_shmctl(shmid as ShmId, cmd as CmdId, buf)?;
|
||||
SYSTEM_V_SHM_MANAGER.do_shmctl(shmid as ShmId, cmd as CmdId, buf)?;
|
||||
Ok(0)
|
||||
}
|
||||
|
@ -7,7 +7,7 @@ use super::do_vfork::{is_vforked_child_process, vfork_return_to_parent};
|
||||
use super::pgrp::clean_pgrp_when_exit;
|
||||
use super::process::{Process, ProcessFilter};
|
||||
use super::{table, ProcessRef, TermStatus, ThreadRef, ThreadStatus};
|
||||
use crate::ipc::SHM_MANAGER;
|
||||
use crate::ipc::SYSTEM_V_SHM_MANAGER;
|
||||
use crate::prelude::*;
|
||||
use crate::signal::{KernelSignal, SigNum};
|
||||
use crate::syscall::CpuContext;
|
||||
@ -120,7 +120,7 @@ fn exit_process(thread: &ThreadRef, term_status: TermStatus) {
|
||||
let mut process_inner = process.inner();
|
||||
// Clean used VM
|
||||
USER_SPACE_VM_MANAGER.free_chunks_when_exit(thread);
|
||||
SHM_MANAGER.detach_shm_when_process_exit(thread);
|
||||
SYSTEM_V_SHM_MANAGER.detach_shm_when_process_exit(thread);
|
||||
|
||||
// The parent is the idle process
|
||||
if parent_inner.is_none() {
|
||||
|
@ -10,7 +10,6 @@ use super::vm_util::{
|
||||
VMRemapOptions,
|
||||
};
|
||||
use crate::config;
|
||||
use crate::ipc::SHM_MANAGER;
|
||||
use crate::process::elf_file::{ElfFile, ProgramHeaderExt};
|
||||
use crate::util::sync::rw_lock::RwLockWriteGuard;
|
||||
|
||||
|
@ -9,6 +9,7 @@ use super::vm_area::{VMAccess, VMArea};
|
||||
use super::vm_chunk_manager::ChunkManager;
|
||||
use super::vm_perms::VMPerms;
|
||||
use super::vm_util::*;
|
||||
use crate::ipc::SYSTEM_V_SHM_MANAGER;
|
||||
use crate::process::{ThreadRef, ThreadStatus};
|
||||
|
||||
use std::collections::BTreeSet;
|
||||
|
Loading…
Reference in New Issue
Block a user