forked from rcore-os/zCore
style: 修改风格,减少提前 return
This commit is contained in:
parent
f5f2a6aedc
commit
497a70d15a
|
@ -6,6 +6,8 @@ use core::fmt::{Debug, Formatter};
|
||||||
use core::marker::PhantomData;
|
use core::marker::PhantomData;
|
||||||
use core::ops::{Deref, DerefMut};
|
use core::ops::{Deref, DerefMut};
|
||||||
|
|
||||||
|
use crate::VirtAddr;
|
||||||
|
|
||||||
/// Wapper of raw pointer from user space.
|
/// Wapper of raw pointer from user space.
|
||||||
#[repr(C)]
|
#[repr(C)]
|
||||||
pub struct UserPtr<T, P: Policy> {
|
pub struct UserPtr<T, P: Policy> {
|
||||||
|
@ -78,10 +80,11 @@ impl<T, P: Policy> UserPtr<T, P> {
|
||||||
/// Checks if `size` is enough to save a value of `T`,
|
/// Checks if `size` is enough to save a value of `T`,
|
||||||
/// then constructs a user pointer from its value `addr`.
|
/// then constructs a user pointer from its value `addr`.
|
||||||
pub fn from_addr_size(addr: usize, size: usize) -> Result<Self> {
|
pub fn from_addr_size(addr: usize, size: usize) -> Result<Self> {
|
||||||
if size < core::mem::size_of::<T>() {
|
if size >= core::mem::size_of::<T>() {
|
||||||
return Err(Error::BufferTooSmall);
|
Ok(Self::from(addr))
|
||||||
|
} else {
|
||||||
|
Err(Error::BufferTooSmall)
|
||||||
}
|
}
|
||||||
Ok(Self::from(addr))
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Returns true if the pointer is null.
|
/// Returns true if the pointer is null.
|
||||||
|
@ -100,21 +103,19 @@ impl<T, P: Policy> UserPtr<T, P> {
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Returns the raw pointer.
|
/// Returns the raw pointer.
|
||||||
pub fn as_ptr(&self) -> *mut T {
|
pub fn as_addr(&self) -> VirtAddr {
|
||||||
self.ptr
|
self.ptr as _
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Checks avaliability of the user pointer.
|
/// Checks avaliability of the user pointer.
|
||||||
///
|
///
|
||||||
/// Returns [`Ok(())`] if it is neither null nor unaligned,
|
/// Returns [`Ok(())`] if it is neither null nor unaligned,
|
||||||
pub fn check(&self) -> Result<()> {
|
pub fn check(&self) -> Result<()> {
|
||||||
if self.ptr.is_null() {
|
if !self.ptr.is_null() && (self.ptr as usize) % core::mem::align_of::<T>() == 0 {
|
||||||
return Err(Error::InvalidPointer);
|
Ok(())
|
||||||
|
} else {
|
||||||
|
Err(Error::InvalidPointer)
|
||||||
}
|
}
|
||||||
if (self.ptr as usize) % core::mem::align_of::<T>() != 0 {
|
|
||||||
return Err(Error::InvalidPointer);
|
|
||||||
}
|
|
||||||
Ok(())
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -134,11 +135,11 @@ impl<T, P: Read> UserPtr<T, P> {
|
||||||
/// Same as [`read`](Self::read),
|
/// Same as [`read`](Self::read),
|
||||||
/// but returns [`None`] when pointer is null.
|
/// but returns [`None`] when pointer is null.
|
||||||
pub fn read_if_not_null(&self) -> Result<Option<T>> {
|
pub fn read_if_not_null(&self) -> Result<Option<T>> {
|
||||||
if self.ptr.is_null() {
|
if !self.ptr.is_null() {
|
||||||
return Ok(None);
|
Ok(Some(self.read()?))
|
||||||
|
} else {
|
||||||
|
Ok(None)
|
||||||
}
|
}
|
||||||
let value = self.read()?;
|
|
||||||
Ok(Some(value))
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Copies elements into a new [`Vec`].
|
/// Copies elements into a new [`Vec`].
|
||||||
|
@ -206,23 +207,23 @@ impl<T, P: Write> UserPtr<T, P> {
|
||||||
/// Same as [`write`](Self::write),
|
/// Same as [`write`](Self::write),
|
||||||
/// but does nothing and returns [`Ok`] when pointer is null.
|
/// but does nothing and returns [`Ok`] when pointer is null.
|
||||||
pub fn write_if_not_null(&mut self, value: T) -> Result<()> {
|
pub fn write_if_not_null(&mut self, value: T) -> Result<()> {
|
||||||
if self.ptr.is_null() {
|
if !self.ptr.is_null() {
|
||||||
return Ok(());
|
self.write(value)
|
||||||
|
} else {
|
||||||
|
Ok(())
|
||||||
}
|
}
|
||||||
self.write(value)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Copies `values.len() * size_of<T>` bytes from `values` to `self`.
|
/// Copies `values.len() * size_of<T>` bytes from `values` to `self`.
|
||||||
/// The source and destination may not overlap.
|
/// The source and destination may not overlap.
|
||||||
pub fn write_array(&mut self, values: &[T]) -> Result<()> {
|
pub fn write_array(&mut self, values: &[T]) -> Result<()> {
|
||||||
if values.is_empty() {
|
if !values.is_empty() {
|
||||||
return Ok(());
|
self.check()?;
|
||||||
|
unsafe {
|
||||||
|
self.ptr
|
||||||
|
.copy_from_nonoverlapping(values.as_ptr(), values.len())
|
||||||
|
};
|
||||||
}
|
}
|
||||||
self.check()?;
|
|
||||||
unsafe {
|
|
||||||
self.ptr
|
|
||||||
.copy_from_nonoverlapping(values.as_ptr(), values.len())
|
|
||||||
};
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -337,20 +338,14 @@ impl<P: Policy> IoVec<P> {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn as_slice(&self) -> Result<&[u8]> {
|
pub fn as_slice(&self) -> Result<&[u8]> {
|
||||||
if self.ptr.is_null() {
|
self.as_mut_slice().map(|s| &*s)
|
||||||
return Err(Error::InvalidVectorAddress);
|
|
||||||
}
|
|
||||||
let slice = unsafe { core::slice::from_raw_parts(self.ptr.as_ptr(), self.len) };
|
|
||||||
Ok(slice)
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
impl<P: Write> IoVec<P> {
|
pub fn as_mut_slice(&self) -> Result<&mut [u8]> {
|
||||||
pub fn as_mut_slice(&mut self) -> Result<&mut [u8]> {
|
if !self.ptr.is_null() {
|
||||||
if self.ptr.is_null() {
|
Ok(unsafe { core::slice::from_raw_parts_mut(self.ptr.ptr, self.len) })
|
||||||
return Err(Error::InvalidVectorAddress);
|
} else {
|
||||||
|
Err(Error::InvalidVectorAddress)
|
||||||
}
|
}
|
||||||
let slice = unsafe { core::slice::from_raw_parts_mut(self.ptr.as_ptr(), self.len) };
|
|
||||||
Ok(slice)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,7 +4,6 @@ use crate::process::ProcessExt;
|
||||||
use crate::signal::{SignalStack, Sigset};
|
use crate::signal::{SignalStack, Sigset};
|
||||||
use alloc::sync::Arc;
|
use alloc::sync::Arc;
|
||||||
use kernel_hal::user::{Out, UserOutPtr, UserPtr};
|
use kernel_hal::user::{Out, UserOutPtr, UserPtr};
|
||||||
use kernel_hal::VirtAddr;
|
|
||||||
use spin::{Mutex, MutexGuard};
|
use spin::{Mutex, MutexGuard};
|
||||||
use zircon_object::task::{CurrentThread, Process, Thread};
|
use zircon_object::task::{CurrentThread, Process, Thread};
|
||||||
use zircon_object::ZxResult;
|
use zircon_object::ZxResult;
|
||||||
|
@ -58,7 +57,7 @@ impl CurrentThreadExt for CurrentThread {
|
||||||
if !clear_child_tid.is_null() {
|
if !clear_child_tid.is_null() {
|
||||||
info!("exit: do futex {:?} wake 1", clear_child_tid);
|
info!("exit: do futex {:?} wake 1", clear_child_tid);
|
||||||
clear_child_tid.write(0).unwrap();
|
clear_child_tid.write(0).unwrap();
|
||||||
let uaddr = clear_child_tid.as_ptr() as VirtAddr;
|
let uaddr = clear_child_tid.as_addr();
|
||||||
let futex = self.proc().linux().get_futex(uaddr);
|
let futex = self.proc().linux().get_futex(uaddr);
|
||||||
futex.wake(1);
|
futex.wake(1);
|
||||||
}
|
}
|
||||||
|
|
|
@ -28,7 +28,7 @@ impl Syscall<'_> {
|
||||||
return Err(LxError::ERANGE);
|
return Err(LxError::ERANGE);
|
||||||
}
|
}
|
||||||
buf.write_cstring(&cwd)?;
|
buf.write_cstring(&cwd)?;
|
||||||
Ok(buf.as_ptr() as usize)
|
Ok(buf.as_addr())
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Change the current directory.
|
/// Change the current directory.
|
||||||
|
|
Loading…
Reference in New Issue