Make VmReader's several methods accept &mut self

This commit is contained in:
jiangjianfeng
2025-03-24 03:35:28 +00:00
committed by Qingsong Chen
parent 9872adaa71
commit 0e1c660225
9 changed files with 58 additions and 56 deletions

View File

@ -415,18 +415,16 @@ impl InitStackReader<'_> {
return_errno_with_message!(Errno::EACCES, "Page not accessible");
};
let mut arg_ptr_reader = frame.reader().skip(read_offset - page_base_addr);
let mut arg_ptr_reader = frame.reader();
arg_ptr_reader.skip(read_offset - page_base_addr);
for _ in 0..argc {
let arg = {
let arg_ptr = arg_ptr_reader.read_val::<Vaddr>()?;
let arg_offset = arg_ptr
.checked_sub(page_base_addr)
.ok_or_else(|| Error::with_message(Errno::EINVAL, "arg_ptr is corrupted"))?;
let mut arg_reader = frame
.reader()
.skip(arg_offset)
.to_fallible()
.limit(MAX_ARG_LEN);
let mut arg_reader = frame.reader().to_fallible();
arg_reader.skip(arg_offset).limit(MAX_ARG_LEN);
arg_reader.read_cstring()?
};
argv.push(arg);
@ -457,7 +455,8 @@ impl InitStackReader<'_> {
return_errno_with_message!(Errno::EACCES, "Page not accessible");
};
let mut envp_ptr_reader = frame.reader().skip(read_offset - page_base_addr);
let mut envp_ptr_reader = frame.reader();
envp_ptr_reader.skip(read_offset - page_base_addr);
for _ in 0..MAX_ENVP_NUMBER {
let env = {
let envp_ptr = envp_ptr_reader.read_val::<Vaddr>()?;
@ -469,11 +468,8 @@ impl InitStackReader<'_> {
let envp_offset = envp_ptr
.checked_sub(page_base_addr)
.ok_or_else(|| Error::with_message(Errno::EINVAL, "envp is corrupted"))?;
let mut envp_reader = frame
.reader()
.skip(envp_offset)
.to_fallible()
.limit(MAX_ENV_LEN);
let mut envp_reader = frame.reader().to_fallible();
envp_reader.skip(envp_offset).limit(MAX_ENV_LEN);
envp_reader.read_cstring()?
};
envp.push(env);

View File

@ -262,7 +262,8 @@ impl<T: Pod, R: Deref<Target = RingBuffer<T>>> Producer<T, R> {
debug_assert!(tail < rb.capacity);
let segment_offset = tail * Self::T_SIZE;
let mut writer = rb.segment.writer().skip(segment_offset);
let mut writer = rb.segment.writer();
writer.skip(segment_offset);
writer.write_val(&item).unwrap();
rb.advance_tail(tail, 1);
@ -317,14 +318,17 @@ impl<R: Deref<Target = RingBuffer<u8>>> Producer<u8, R> {
let tail = rb.tail();
let write_len = if tail + write_len > rb.capacity {
// Write into two separate parts
let mut writer = rb.segment.writer().skip(tail).limit(rb.capacity - tail);
let mut writer = rb.segment.writer();
writer.skip(tail).limit(rb.capacity - tail);
let mut len = reader.read(&mut writer)?;
let mut writer = rb.segment.writer().limit(write_len - (rb.capacity - tail));
let mut writer = rb.segment.writer();
writer.limit(write_len - (rb.capacity - tail));
len += reader.read(&mut writer)?;
len
} else {
let mut writer = rb.segment.writer().skip(tail).limit(write_len);
let mut writer = rb.segment.writer();
writer.skip(tail).limit(write_len);
reader.read(&mut writer)?
};
@ -359,7 +363,8 @@ impl<T: Pod, R: Deref<Target = RingBuffer<T>>> Consumer<T, R> {
debug_assert!(head < rb.capacity);
let segment_offset = head * Self::T_SIZE;
let mut reader = rb.segment.reader().skip(segment_offset);
let mut reader = rb.segment.reader();
reader.skip(segment_offset);
let item = reader.read_val::<T>().unwrap();
rb.advance_head(head, 1);
@ -413,14 +418,17 @@ impl<R: Deref<Target = RingBuffer<u8>>> Consumer<u8, R> {
let head = rb.head();
let read_len = if head + read_len > rb.capacity {
// Read from two separate parts
let mut reader = rb.segment.reader().skip(head).limit(rb.capacity - head);
let mut reader = rb.segment.reader();
reader.skip(head).limit(rb.capacity - head);
let mut len = writer.write(&mut reader)?;
let mut reader = rb.segment.reader().limit(read_len - (rb.capacity - head));
let mut reader = rb.segment.reader();
reader.limit(read_len - (rb.capacity - head));
len += writer.write(&mut reader)?;
len
} else {
let mut reader = rb.segment.reader().skip(head).limit(read_len);
let mut reader = rb.segment.reader();
reader.skip(head).limit(read_len);
writer.write(&mut reader)?
};