async goes boom
All checks were successful
continuous-integration/drone/push Build is passing

Signed-off-by: Julien CLEMENT <julien.clement@epita.fr>
This commit is contained in:
Julien CLEMENT 2022-12-20 20:55:49 +01:00
parent af9a7aa712
commit 3968c4c376
3 changed files with 19 additions and 13 deletions

@ -9,6 +9,7 @@ use core::convert::TryInto;
use lazy_static::lazy_static;
use spin::Mutex;
use crate::utils::AsyncMutex;
use x86_64::instructions::port::Port;
const CD_SECTOR_SIZE: usize = 2048;
@ -58,15 +59,16 @@ static ATAPI_SIG: [u8; 4] = [
];
lazy_static! {
pub static ref DRIVE: Mutex<Option<ATABus>> = {
Mutex::new(ATABus::discover_atapi_drive())
pub static ref DRIVE: AsyncMutex<Option<ATABus>> = {
AsyncMutex::new(ATABus::discover_atapi_drive())
};
}
pub fn init() {
pub async fn init() {
println!("Detecting drives");
match DRIVE.lock().as_ref() {
let guard = DRIVE.lock().await;
match guard.as_ref() {
None => println!("No drive detected :("),
Some(drive) => {
let drive_type = match drive.current_drive {
@ -322,6 +324,7 @@ impl ATABus {
pub async fn print_block() {
DRIVE.lock().as_mut().unwrap().read_block(500).await;
serial_println!("{:x?}", DRIVE.lock().as_mut().unwrap().block);
let mut guard = DRIVE.lock().await;
guard.as_mut().unwrap().read_block(500).await;
serial_println!("{:x?}", guard.as_mut().unwrap().block);
}

@ -6,9 +6,10 @@ use crate::utils::unserialize;
use iso9660::{IsoPrimVolDesc};
pub async fn init_prim_vol_desc() {
let desc_block = DRIVE
let mut guard = DRIVE
.lock()
.as_mut()
.await;
let desc_block = guard.as_mut()
.unwrap()
.read_block(iso9660::ISO_PRIM_VOLDESC_BLOCK)
.await;

@ -4,14 +4,14 @@ use core::cell::UnsafeCell;
use core::ops::{Deref, DerefMut, Drop};
use core::sync::atomic::{AtomicBool, Ordering};
use core::task::{Context, Poll};
use alloc::rc::Rc;
use alloc::sync::Arc;
use futures_util::task::AtomicWaker;
#[derive(Clone)]
struct Lock {
lock: Rc<AtomicBool>,
waker: Rc<AtomicWaker>,
lock: Arc<AtomicBool>,
waker: Arc<AtomicWaker>,
}
pub struct AsyncMutex<T> {
@ -29,8 +29,8 @@ where
impl Lock {
fn new() -> Self {
Lock {
lock: Rc::new(AtomicBool::new(false)),
waker: Rc::new(AtomicWaker::new()),
lock: Arc::new(AtomicBool::new(false)),
waker: Arc::new(AtomicWaker::new()),
}
}
@ -86,6 +86,8 @@ impl<T> AsyncMutex<T> {
}
}
unsafe impl<T> Send for AsyncMutex<T> {}
unsafe impl<T> Sync for AsyncMutex<T> {}
impl<T> Drop for AsyncMutexGuard<'_, T> {
fn drop(&mut self) {