Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commitbe57ae0

Browse files
feat(wq): non interruptable and non blocking
Signed-off-by: Anhad Singh <andypythonappdeveloper@gmail.com>
1 parentbf0f496 commitbe57ae0

File tree

13 files changed

+186
-80
lines changed

13 files changed

+186
-80
lines changed

‎src/aero_kernel/src/drivers/tty/vtty.rs

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ use crate::mem::paging::VirtAddr;
3232
usecrate::userland::scheduler;
3333
usecrate::userland::task::Task;
3434
usecrate::userland::terminal::TerminalDevice;
35-
usecrate::utils::sync::{Mutex,WaitQueue};
35+
usecrate::utils::sync::{Mutex,WaitQueue,WaitQueueFlags};
3636

3737
#[cfg(target_arch ="x86_64")]
3838
usecrate::drivers::keyboard::KeyCode;
@@ -247,11 +247,12 @@ impl INodeInterface for Tty {
247247
self.connected.fetch_sub(1,Ordering::SeqCst);
248248
}
249249

250-
fnread_at(&self,_flags:OpenFlags,_offset:usize,buffer:&mut[u8]) -> fs::Result<usize>{
251-
self.block_queue
252-
.block_on(&self.stdin, |future| future.is_complete())?;
253-
254-
letmut stdin =self.stdin.lock_irq();
250+
fnread_at(&self,flags:OpenFlags,_offset:usize,buffer:&mut[u8]) -> fs::Result<usize>{
251+
letmut stdin =self.block_queue.wait(
252+
WaitQueueFlags::from(flags) |WaitQueueFlags::DISABLE_IRQ,
253+
&self.stdin,
254+
|future| future.is_complete(),
255+
)?;
255256

256257
// record the back buffer size before swapping
257258
stdin.swap_buffer();

‎src/aero_kernel/src/fs/eventfd.rs

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -54,19 +54,14 @@ impl INodeInterface for EventFd {
5454
Ok(None)
5555
}
5656

57-
fnread_at(
58-
&self,
59-
_flags:OpenFlags,
60-
_offset:usize,
61-
buffer:&mut[u8],
62-
) ->super::Result<usize>{
57+
fnread_at(&self,flags:OpenFlags,_offset:usize,buffer:&mut[u8]) ->super::Result<usize>{
6358
let size = core::mem::size_of::<u64>();
6459
assert!(buffer.len() >= size);
6560

6661
// SAFETY: We have above verified that it is safe to dereference
6762
// the value.
6863
let value =unsafe{&mut*(buffer.as_mut_ptr().cast::<u64>())};
69-
letmut count =self.wq.block_on(&self.count, |e|**e !=0)?;
64+
letmut count =self.wq.wait(flags.into(),&self.count, |e|**e !=0)?;
7065

7166
*value =*count;
7267
*count =0;// reset the counter

‎src/aero_kernel/src/fs/pipe.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ use alloc::sync::Arc;
2222
use spin::Once;
2323

2424
usecrate::utils::buffer::Buffer;
25-
usecrate::utils::sync::{Mutex,WaitQueue};
25+
usecrate::utils::sync::{Mutex,WaitQueue,WaitQueueFlags};
2626

2727
usesuper::cache::DirCacheItem;
2828
usesuper::file_table::FileHandle;
@@ -84,7 +84,7 @@ impl INodeInterface for Pipe {
8484
returnErr(FileSystemError::WouldBlock);
8585
}
8686

87-
letmut buffer =self.readers.block_on(&self.queue, |lock|{
87+
letmut buffer =self.readers.wait(flags.into(),&self.queue, |lock|{
8888
lock.has_data() ||self.active_writers() ==0
8989
})?;
9090

‎src/aero_kernel/src/main.rs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@
4545
cfg_match,// https://github.com/rust-lang/rust/issues/115585
4646
associated_type_defaults,
4747
new_zeroed_alloc,// https://github.com/rust-lang/rust/issues/129396
48-
sync_unsafe_cell
48+
sync_unsafe_cell,
4949
)]
5050
// TODO(andypython): can we remove the dependency of "prelude_import" and "lang_items"?
5151
// `lang_items` => is currently used for the personality function (`rust_eh_personality`).
@@ -59,6 +59,7 @@
5959
#![reexport_test_harness_main ="test_main"]
6060
#![warn(clippy::needless_pass_by_value)]
6161
#![deny(clippy::ptr_as_ptr)]
62+
#![allow(binary_asm_labels)]
6263

6364
#[macro_use]
6465
externcrate aero_proc;
@@ -214,7 +215,7 @@ fn kernel_dbg_thread() {
214215

215216
usecrate::drivers::uart::{self,LineStatus,COM_1};
216217
usecrate::userland::task::TaskId;
217-
usecrate::utils::sync::WaitQueue;
218+
usecrate::utils::sync::{WaitQueue,WaitQueueFlags};
218219

219220
uart::setup_interrupts();
220221

@@ -229,7 +230,7 @@ fn kernel_dbg_thread() {
229230

230231
loop{
231232
letmut com_1 = input_wq
232-
.block_on(com_1, |com_1|{
233+
.wait(WaitQueueFlags::empty(),com_1, |com_1|{
233234
com_1.line_status().contains(LineStatus::INPUT_FULL)
234235
})
235236
.unwrap();

‎src/aero_kernel/src/socket/netlink.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -221,7 +221,7 @@ impl INodeInterface for NetLinkSocket {
221221

222222
fnrecv(
223223
&self,
224-
_fd_flags:OpenFlags,
224+
fd_flags:OpenFlags,
225225
message_hdr:&mutMessageHeader,
226226
flags: socket::MessageFlags,
227227
) -> fs::Result<usize>{
@@ -239,7 +239,7 @@ impl INodeInterface for NetLinkSocket {
239239

240240
letmut queue =self
241241
.recv_wq
242-
.block_on(&self.recv_queue, |queue| !queue.is_empty())?;
242+
.wait(fd_flags.into(),&self.recv_queue, |queue| !queue.is_empty())?;
243243

244244
letmut bytes_copied =0;
245245
dbg!(message_hdr.iovecs_mut());

‎src/aero_kernel/src/socket/tcp.rs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ use crate::fs::{self, FileSystemError};
3232
usecrate::net;
3333
usecrate::net::shim::PacketSend;
3434
usecrate::net::{tcp,NetworkDevice};
35-
usecrate::utils::sync::{Mutex,WaitQueue};
35+
usecrate::utils::sync::{Mutex,WaitQueue,WaitQueueFlags};
3636

3737
// ./aero.py -- -netdev user,id=mynet0 -device e1000,netdev=mynet0,id=ck_nic0 -object
3838
// filter-dump,id=mynet0,netdev=mynet0,file=qemulog.log
@@ -97,7 +97,7 @@ impl TcpSocket {
9797
Err(TcpError::WouldBlock) =>{
9898
drop(tcp);
9999

100-
letmut socket =self.wq.block_on(&self.tcp, |tcp|{
100+
letmut socket =self.wq.wait(flags.into(),&self.tcp, |tcp|{
101101
tcp.as_ref()
102102
.is_none_or(|socket| !socket.recv_queue.is_empty())
103103
})?;
@@ -145,7 +145,8 @@ impl INodeInterface for TcpSocket {
145145
*tcp =Some(socket);
146146
}
147147

148-
let _ =self.wq.block_on(&self.tcp, |x|{
148+
// FIXME: connect() should pass the fd.
149+
let _ =self.wq.wait(WaitQueueFlags::empty(),&self.tcp, |x|{
149150
x.as_ref().unwrap().state() ==State::Established
150151
});
151152

‎src/aero_kernel/src/socket/udp.rs

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -187,17 +187,16 @@ impl INodeInterface for UdpSocket {
187187

188188
fnrecv(
189189
&self,
190-
_fd_flags:OpenFlags,
190+
fd_flags:OpenFlags,
191191
message_hdr:&mutMessageHeader,
192192
_flags:MessageFlags,
193193
) -> fs::Result<usize>{
194194
// assert!(flags.is_empty());
195195

196-
ifself.inner.lock_irq().incoming.is_empty() &&self.is_non_block(){
197-
returnErr(FileSystemError::WouldBlock);
198-
}
196+
letmut this =self
197+
.wq
198+
.wait(fd_flags.into(),&self.inner, |e| !e.incoming.is_empty())?;
199199

200-
letmut this =self.wq.block_on(&self.inner, |e| !e.incoming.is_empty())?;
201200
let packet = this.incoming.pop().expect("recv: someone was greedy");
202201

203202
letmut data = packet.as_slice().to_vec();

‎src/aero_kernel/src/socket/unix.rs

Lines changed: 14 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ use crate::fs::inode::{DirEntry, FileType, INodeInterface, Metadata, PollFlags,
3232
usecrate::fs::{FileSystemError,Path};
3333

3434
usecrate::mem::paging::VirtAddr;
35-
usecrate::utils::sync::{Mutex,WaitQueue};
35+
usecrate::utils::sync::{Mutex,WaitQueue,WaitQueueFlags};
3636

3737
usesuper::SocketAddrRef;
3838

@@ -243,14 +243,11 @@ impl INodeInterface for UnixSocket {
243243
_offset:usize,
244244
user_buffer:&mut[u8],
245245
) -> fs::Result<usize>{
246-
ifself.buffer.lock_irq().is_empty() && flags.is_nonblock(){
247-
returnErr(FileSystemError::WouldBlock);
248-
}
249-
250-
letmut buffer =self.wq.block_on(&self.buffer, |e| !e.is_empty())?;
246+
letmut buf =self
247+
.wq
248+
.wait(flags.into(),&self.buffer, |e| !e.is_empty())?;
251249

252-
let read = buffer.read(user_buffer);
253-
Ok(read)
250+
Ok(buf.read(user_buffer))
254251
}
255252

256253
fnwrite_at(&self,_offset:usize,buffer:&[u8]) -> fs::Result<usize>{
@@ -325,12 +322,16 @@ impl INodeInterface for UnixSocket {
325322
target.wq.notify_all();
326323
core::mem::drop(itarget);// release the lock
327324

328-
let _ =self.wq.block_on(&self.inner, |e| e.state.is_connected())?;
325+
// FIXME: connect() should pass fd.
326+
let _ =self.wq.wait(WaitQueueFlags::empty(),&self.inner, |e|{
327+
e.state.is_connected()
328+
})?;
329329
Ok(())
330330
}
331331

332332
fnaccept(&self,address:Option<(VirtAddr,&mutu32)>) -> fs::Result<Arc<UnixSocket>>{
333-
letmut inner =self.wq.block_on(&self.inner, |e|{
333+
// TODO: accept
334+
letmut inner =self.wq.wait(WaitQueueFlags::empty(),&self.inner, |e|{
334335
e.state.queue().is_some_and(|x| !x.is_empty())
335336
})?;
336337

@@ -387,11 +388,9 @@ impl INodeInterface for UnixSocket {
387388
_ =>returnErr(FileSystemError::NotConnected),
388389
};
389390

390-
ifself.buffer.lock_irq().is_empty() && fd_flags.is_nonblock(){
391-
returnErr(FileSystemError::WouldBlock);
392-
}
393-
394-
letmut buffer =self.wq.block_on(&self.buffer, |e| !e.is_empty())?;
391+
letmut buffer =self
392+
.wq
393+
.wait(fd_flags.into(),&self.buffer, |e| !e.is_empty())?;
395394

396395
ifletSome(addr) = header.name_mut::<SocketAddrUnix>(){
397396
*addr = peer.inner.lock_irq().address.as_ref().cloned().unwrap();

‎src/aero_kernel/src/syscall/fs.rs

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,6 @@ impl fmt::Display for FileDescriptor {
5656
let path = file_handle.inode.absolute_path();
5757
write!(f,"{{ {} -> {} }}",self.0, path)
5858
}else{
59-
// invalid file descriptor
6059
write!(f,"{{ {} -> INVALID }}",self.0)
6160
}
6261
}
@@ -164,10 +163,7 @@ pub fn getdents(fd: FileDescriptor, buffer: &mut [u8]) -> Result<usize, SyscallE
164163

165164
#[syscall]
166165
pubfnclose(fd:FileDescriptor) ->Result<usize,SyscallError>{
167-
let res = scheduler::get_scheduler()
168-
.current_task()
169-
.file_table
170-
.close_file(fd.into());
166+
let res = scheduler::current_thread().file_table.close_file(fd.into());
171167

172168
if res{
173169
Ok(0)
@@ -218,11 +214,10 @@ pub fn mkdirat(dfd: usize, path: &Path) -> Result<usize, SyscallError> {
218214
// pathname is interpreted relative to the current working directory of the
219215
// calling task.
220216
if dfdasisize == aero_syscall::AT_FDCWD{
221-
let cwd = scheduler::get_scheduler().current_task().cwd_dirent();
217+
let cwd = scheduler::current_thread().cwd_dirent();
222218
(cwd.inode(), path.as_str())
223219
}else{
224-
let handle = scheduler::get_scheduler()
225-
.current_task()
220+
let handle = scheduler::current_thread()
226221
.file_table
227222
.get_handle(dfd)
228223
.ok_or(SyscallError::EBADFD)?;

‎src/aero_kernel/src/syscall/ipc.rs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
usecrate::userland::scheduler::get_scheduler;
1919
usecrate::userland::task::TaskId;
2020

21-
usecrate::utils::sync::{Mutex,WaitQueue};
21+
usecrate::utils::sync::{Mutex,WaitQueue,WaitQueueFlags};
2222

2323
use aero_syscall::SyscallError;
2424
use alloc::collections::VecDeque;
@@ -103,7 +103,9 @@ pub fn recv(pid_ptr: &mut usize, output: &mut [u8], block: usize) -> Result<usiz
103103
let mq =&current.message_queue;
104104
letmut our_queue = mq
105105
.blockqueue
106-
.block_on(&mq.queue, |msg| msg.front().is_some())
106+
.wait(WaitQueueFlags::empty(),&mq.queue, |msg|{
107+
msg.front().is_some()
108+
})
107109
.unwrap();
108110

109111
let msg = our_queue

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp