|
@@ -2,7 +2,10 @@ use alloc::{
|
|
collections::LinkedList,
|
|
collections::LinkedList,
|
|
sync::{Arc, Weak},
|
|
sync::{Arc, Weak},
|
|
};
|
|
};
|
|
-use core::hash::{Hash, Hasher};
|
|
|
|
|
|
+use core::{
|
|
|
|
+ hash::{Hash, Hasher},
|
|
|
|
+ ops::{Deref, DerefMut},
|
|
|
|
+};
|
|
use core::{
|
|
use core::{
|
|
intrinsics::{likely, unlikely},
|
|
intrinsics::{likely, unlikely},
|
|
mem,
|
|
mem,
|
|
@@ -646,17 +649,39 @@ impl Futex {
|
|
const ROBUST_LIST_LIMIT: isize = 2048;
|
|
const ROBUST_LIST_LIMIT: isize = 2048;
|
|
|
|
|
|
#[derive(Debug, Copy, Clone)]
|
|
#[derive(Debug, Copy, Clone)]
|
|
-pub struct RobustList {
|
|
|
|
|
|
+#[repr(C)]
|
|
|
|
+struct PosixRobustList {
|
|
next: VirtAddr,
|
|
next: VirtAddr,
|
|
}
|
|
}
|
|
|
|
|
|
#[derive(Debug, Copy, Clone)]
|
|
#[derive(Debug, Copy, Clone)]
|
|
-pub struct RobustListHead {
|
|
|
|
- list: RobustList,
|
|
|
|
|
|
+#[repr(C)]
|
|
|
|
+pub struct PosixRobustListHead {
|
|
|
|
+ list: PosixRobustList,
|
|
futex_offset: isize,
|
|
futex_offset: isize,
|
|
list_op_pending: VirtAddr,
|
|
list_op_pending: VirtAddr,
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+#[derive(Debug, Copy, Clone)]
|
|
|
|
+pub struct RobustListHead {
|
|
|
|
+ pub posix: PosixRobustListHead,
|
|
|
|
+ pub uaddr: VirtAddr,
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+impl Deref for RobustListHead {
|
|
|
|
+ type Target = PosixRobustListHead;
|
|
|
|
+
|
|
|
|
+ fn deref(&self) -> &Self::Target {
|
|
|
|
+ &self.posix
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+impl DerefMut for RobustListHead {
|
|
|
|
+ fn deref_mut(&mut self) -> &mut Self::Target {
|
|
|
|
+ &mut self.posix
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+
|
|
impl RobustListHead {
|
|
impl RobustListHead {
|
|
/// # 获得futex的用户空间地址
|
|
/// # 获得futex的用户空间地址
|
|
pub fn futex_uaddr(&self, entry: VirtAddr) -> VirtAddr {
|
|
pub fn futex_uaddr(&self, entry: VirtAddr) -> VirtAddr {
|
|
@@ -677,18 +702,21 @@ impl RobustListHead {
|
|
/// - head_uaddr:robust list head用户空间地址
|
|
/// - head_uaddr:robust list head用户空间地址
|
|
/// - len:robust list head的长度
|
|
/// - len:robust list head的长度
|
|
pub fn set_robust_list(head_uaddr: VirtAddr, len: usize) -> Result<usize, SystemError> {
|
|
pub fn set_robust_list(head_uaddr: VirtAddr, len: usize) -> Result<usize, SystemError> {
|
|
- let robust_list_head_len = mem::size_of::<RobustListHead>();
|
|
|
|
|
|
+ let robust_list_head_len = mem::size_of::<PosixRobustListHead>();
|
|
if unlikely(len != robust_list_head_len) {
|
|
if unlikely(len != robust_list_head_len) {
|
|
return Err(SystemError::EINVAL);
|
|
return Err(SystemError::EINVAL);
|
|
}
|
|
}
|
|
|
|
|
|
let user_buffer_reader = UserBufferReader::new(
|
|
let user_buffer_reader = UserBufferReader::new(
|
|
- head_uaddr.as_ptr::<RobustListHead>(),
|
|
|
|
- mem::size_of::<RobustListHead>(),
|
|
|
|
|
|
+ head_uaddr.as_ptr::<PosixRobustListHead>(),
|
|
|
|
+ mem::size_of::<PosixRobustListHead>(),
|
|
true,
|
|
true,
|
|
)?;
|
|
)?;
|
|
- let robust_list_head = *user_buffer_reader.read_one_from_user::<RobustListHead>(0)?;
|
|
|
|
-
|
|
|
|
|
|
+ let robust_list_head = *user_buffer_reader.read_one_from_user::<PosixRobustListHead>(0)?;
|
|
|
|
+ let robust_list_head = RobustListHead {
|
|
|
|
+ posix: robust_list_head,
|
|
|
|
+ uaddr: head_uaddr,
|
|
|
|
+ };
|
|
// 向内核注册robust list
|
|
// 向内核注册robust list
|
|
ProcessManager::current_pcb().set_robust_list(Some(robust_list_head));
|
|
ProcessManager::current_pcb().set_robust_list(Some(robust_list_head));
|
|
|
|
|
|
@@ -726,11 +754,11 @@ impl RobustListHead {
|
|
core::mem::size_of::<usize>(),
|
|
core::mem::size_of::<usize>(),
|
|
true,
|
|
true,
|
|
)?;
|
|
)?;
|
|
- user_writer.copy_one_to_user(&mem::size_of::<RobustListHead>(), 0)?;
|
|
|
|
|
|
+ user_writer.copy_one_to_user(&mem::size_of::<PosixRobustListHead>(), 0)?;
|
|
// 将head拷贝到用户空间head
|
|
// 将head拷贝到用户空间head
|
|
let mut user_writer = UserBufferWriter::new(
|
|
let mut user_writer = UserBufferWriter::new(
|
|
- head_uaddr.as_ptr::<RobustListHead>(),
|
|
|
|
- mem::size_of::<RobustListHead>(),
|
|
|
|
|
|
+ head_uaddr.as_ptr::<PosixRobustListHead>(),
|
|
|
|
+ mem::size_of::<PosixRobustListHead>(),
|
|
true,
|
|
true,
|
|
)?;
|
|
)?;
|
|
user_writer.copy_one_to_user(&robust_list_head, 0)?;
|
|
user_writer.copy_one_to_user(&robust_list_head, 0)?;
|
|
@@ -750,6 +778,7 @@ impl RobustListHead {
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
};
|
|
};
|
|
|
|
+
|
|
// 遍历当前进程/线程的robust list
|
|
// 遍历当前进程/线程的robust list
|
|
for futex_uaddr in head.futexes() {
|
|
for futex_uaddr in head.futexes() {
|
|
let ret = Self::handle_futex_death(futex_uaddr, pcb.raw_pid().into() as u32);
|
|
let ret = Self::handle_futex_death(futex_uaddr, pcb.raw_pid().into() as u32);
|
|
@@ -879,7 +908,7 @@ impl Iterator for FutexIterator<'_> {
|
|
return None;
|
|
return None;
|
|
}
|
|
}
|
|
|
|
|
|
- while self.entry.data() != &self.robust_list_head.list as *const RobustList as usize {
|
|
|
|
|
|
+ while self.entry.data() != self.robust_list_head.uaddr.data() {
|
|
if self.count == ROBUST_LIST_LIMIT {
|
|
if self.count == ROBUST_LIST_LIMIT {
|
|
break;
|
|
break;
|
|
}
|
|
}
|
|
@@ -895,8 +924,13 @@ impl Iterator for FutexIterator<'_> {
|
|
};
|
|
};
|
|
|
|
|
|
// 安全地读取下一个entry
|
|
// 安全地读取下一个entry
|
|
- let next_entry = RobustListHead::safe_read::<RobustList>(self.entry)
|
|
|
|
- .and_then(|reader| reader.read_one_from_user::<RobustList>(0).ok().cloned())?;
|
|
|
|
|
|
+ let next_entry =
|
|
|
|
+ RobustListHead::safe_read::<PosixRobustList>(self.entry).and_then(|reader| {
|
|
|
|
+ reader
|
|
|
|
+ .read_one_from_user::<PosixRobustList>(0)
|
|
|
|
+ .ok()
|
|
|
|
+ .cloned()
|
|
|
|
+ })?;
|
|
|
|
|
|
self.entry = next_entry.next;
|
|
self.entry = next_entry.next;
|
|
|
|
|