use exclusive_session to eliminate some explicit drops.
This commit is contained in:
parent
ba611a1458
commit
fb196d35a9
8 changed files with 21 additions and 54 deletions
|
@ -28,17 +28,10 @@ impl BlockDevice for VirtIOBlock {
|
|||
let nb = *DEV_NON_BLOCKING_ACCESS.exclusive_access();
|
||||
if nb {
|
||||
let mut resp = BlkResp::default();
|
||||
/*
|
||||
let task_cx_ptr = self.virtio_blk.exclusive_session(|blk| {
|
||||
let token = unsafe { blk.read_block_nb(block_id, buf, &mut resp).unwrap() };
|
||||
self.condvars.get(&token).unwrap().wait_no_sched()
|
||||
});
|
||||
*/
|
||||
let mut blk = self.virtio_blk.exclusive_access();
|
||||
let token = unsafe { blk.read_block_nb(block_id, buf, &mut resp).unwrap() };
|
||||
//println!("waiting on token {}", token);
|
||||
let task_cx_ptr = self.condvars.get(&token).unwrap().wait_no_sched();
|
||||
drop(blk);
|
||||
schedule(task_cx_ptr);
|
||||
assert_eq!(
|
||||
resp.status(),
|
||||
|
@ -56,16 +49,10 @@ impl BlockDevice for VirtIOBlock {
|
|||
let nb = *DEV_NON_BLOCKING_ACCESS.exclusive_access();
|
||||
if nb {
|
||||
let mut resp = BlkResp::default();
|
||||
/*
|
||||
let task_cx_ptr = self.virtio_blk.exclusive_session(|blk| {
|
||||
let token = unsafe { blk.write_block_nb(block_id, buf, &mut resp).unwrap() };
|
||||
self.condvars.get(&token).unwrap().wait_no_sched()
|
||||
});
|
||||
*/
|
||||
let mut blk = self.virtio_blk.exclusive_access();
|
||||
let token = unsafe { blk.write_block_nb(block_id, buf, &mut resp).unwrap() };
|
||||
let task_cx_ptr = self.condvars.get(&token).unwrap().wait_no_sched();
|
||||
drop(blk);
|
||||
schedule(task_cx_ptr);
|
||||
assert_eq!(
|
||||
resp.status(),
|
||||
|
@ -80,21 +67,11 @@ impl BlockDevice for VirtIOBlock {
|
|||
}
|
||||
}
|
||||
fn handle_irq(&self) {
|
||||
//println!("into handle_irq");
|
||||
/*
|
||||
self.virtio_blk.exclusive_session(|blk| {
|
||||
//println!("not panic here");
|
||||
while let Ok(token) = blk.pop_used() {
|
||||
//println!("wakeup virtio.token {}", token);
|
||||
self.condvars.get(&token).unwrap().signal();
|
||||
}
|
||||
});
|
||||
*/
|
||||
let mut blk = self.virtio_blk.exclusive_access();
|
||||
while let Ok(token) = blk.pop_used() {
|
||||
//println!("wakeup virtio.token {}", token);
|
||||
self.condvars.get(&token).unwrap().signal();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -146,7 +146,6 @@ impl<const BASE_ADDR: usize> NS16550a<BASE_ADDR> {
|
|||
|
||||
impl<const BASE_ADDR: usize> CharDevice for NS16550a<BASE_ADDR> {
|
||||
fn read(&self) -> u8 {
|
||||
//println!("NS16550a::read");
|
||||
loop {
|
||||
let mut inner = self.inner.exclusive_access();
|
||||
if let Some(ch) = inner.read_buffer.pop_front() {
|
||||
|
@ -154,7 +153,6 @@ impl<const BASE_ADDR: usize> CharDevice for NS16550a<BASE_ADDR> {
|
|||
} else {
|
||||
let task_cx_ptr = self.condvar.wait_no_sched();
|
||||
drop(inner);
|
||||
//println!("before scheduling");
|
||||
schedule(task_cx_ptr);
|
||||
}
|
||||
}
|
||||
|
@ -164,15 +162,13 @@ impl<const BASE_ADDR: usize> CharDevice for NS16550a<BASE_ADDR> {
|
|||
inner.ns16550a.write(ch);
|
||||
}
|
||||
fn handle_irq(&self) {
|
||||
let mut inner = self.inner.exclusive_access();
|
||||
let mut count = 0;
|
||||
while let Some(ch) = inner.ns16550a.read() {
|
||||
//println!("got {}", ch as char);
|
||||
count += 1;
|
||||
inner.read_buffer.push_back(ch);
|
||||
}
|
||||
drop(inner);
|
||||
//assert_eq!(count, 1);
|
||||
self.inner.exclusive_session(|inner| {
|
||||
while let Some(ch) = inner.ns16550a.read() {
|
||||
count += 1;
|
||||
inner.read_buffer.push_back(ch);
|
||||
}
|
||||
});
|
||||
if count > 0 {
|
||||
self.condvar.signal();
|
||||
}
|
||||
|
|
|
@ -62,6 +62,7 @@ impl PLIC {
|
|||
self.priority_ptr(intr_source_id).write_volatile(priority);
|
||||
}
|
||||
}
|
||||
#[allow(unused)]
|
||||
pub fn get_priority(&mut self, intr_source_id: usize) -> u32 {
|
||||
unsafe { self.priority_ptr(intr_source_id).read_volatile() & 7 }
|
||||
}
|
||||
|
@ -100,6 +101,7 @@ impl PLIC {
|
|||
threshold_ptr.write_volatile(threshold);
|
||||
}
|
||||
}
|
||||
#[allow(unused)]
|
||||
pub fn get_threshold(&mut self, hart_id: usize, target_priority: IntrTargetPriority) -> u32 {
|
||||
let threshold_ptr = self.threshold_ptr_of_hart_with_priority(hart_id, target_priority);
|
||||
unsafe { threshold_ptr.read_volatile() & 7 }
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue