Simplify vesad by using SchemeMut

This commit is contained in:
Jeremy Soller 2016-10-22 14:54:13 -06:00
parent 00ac77765c
commit b1293046a3
3 changed files with 34 additions and 50 deletions

View file

@ -9,7 +9,7 @@ extern crate syscall;
use std::{env, mem, thread}; use std::{env, mem, thread};
use std::fs::File; use std::fs::File;
use std::io::{Read, Write}; use std::io::{Read, Write};
use syscall::{physmap, physunmap, Packet, Scheme, EVENT_READ, MAP_WRITE, MAP_WRITE_COMBINE}; use syscall::{physmap, physunmap, Packet, SchemeMut, EVENT_READ, MAP_WRITE, MAP_WRITE_COMBINE};
use mode_info::VBEModeInfo; use mode_info::VBEModeInfo;
use primitive::fast_set64; use primitive::fast_set64;
@ -57,7 +57,7 @@ fn main() {
let onscreen = unsafe { physmap(physbaseptr, size * 4, MAP_WRITE | MAP_WRITE_COMBINE).expect("vesad: failed to map VBE LFB") }; let onscreen = unsafe { physmap(physbaseptr, size * 4, MAP_WRITE | MAP_WRITE_COMBINE).expect("vesad: failed to map VBE LFB") };
unsafe { fast_set64(onscreen as *mut u64, 0, size/2) }; unsafe { fast_set64(onscreen as *mut u64, 0, size/2) };
let scheme = DisplayScheme::new(width, height, onscreen, &spec); let mut scheme = DisplayScheme::new(width, height, onscreen, &spec);
let mut blocked = Vec::new(); let mut blocked = Vec::new();
loop { loop {
@ -87,7 +87,7 @@ fn main() {
} }
} }
for (screen_id, screen) in scheme.screens.borrow().iter() { for (screen_id, screen) in scheme.screens.iter() {
if ! screen.will_block() { if ! screen.will_block() {
let event_packet = Packet { let event_packet = Packet {
id: 0, id: 0,

View file

@ -1,20 +1,15 @@
use std::cell::{Cell, RefCell};
use std::collections::BTreeMap; use std::collections::BTreeMap;
use std::{mem, slice, str}; use std::{mem, slice, str};
use orbclient::{Event, EventOption}; use orbclient::{Event, EventOption};
use syscall::{Result, Error, EACCES, EBADF, ENOENT, Scheme}; use syscall::{Result, Error, EACCES, EBADF, ENOENT, SchemeMut};
use display::Display; use display::Display;
use screen::{Screen, GraphicScreen, TextScreen}; use screen::{Screen, GraphicScreen, TextScreen};
pub struct DisplayScheme { pub struct DisplayScheme {
width: usize, active: usize,
height: usize, pub screens: BTreeMap<usize, Box<Screen>>
onscreen: usize,
active: Cell<usize>,
next_screen: Cell<usize>,
pub screens: RefCell<BTreeMap<usize, Box<Screen>>>
} }
impl DisplayScheme { impl DisplayScheme {
@ -32,18 +27,13 @@ impl DisplayScheme {
} }
DisplayScheme { DisplayScheme {
width: width, active: 1,
height: height, screens: screens
onscreen: onscreen,
active: Cell::new(1),
next_screen: Cell::new(screen_i),
screens: RefCell::new(screens)
} }
} }
pub fn will_block(&self, id: usize) -> bool { pub fn will_block(&self, id: usize) -> bool {
let screens = self.screens.borrow(); if let Some(screen) = self.screens.get(&id) {
if let Some(screen) = screens.get(&id) {
screen.will_block() screen.will_block()
} else { } else {
false false
@ -51,8 +41,8 @@ impl DisplayScheme {
} }
} }
impl Scheme for DisplayScheme { impl SchemeMut for DisplayScheme {
fn open(&self, path: &[u8], _flags: usize, uid: u32, _gid: u32) -> Result<usize> { fn open(&mut self, path: &[u8], _flags: usize, uid: u32, _gid: u32) -> Result<usize> {
if path == b"input" { if path == b"input" {
if uid == 0 { if uid == 0 {
Ok(0) Ok(0)
@ -62,7 +52,7 @@ impl Scheme for DisplayScheme {
} else { } else {
let path_str = str::from_utf8(path).unwrap_or(""); let path_str = str::from_utf8(path).unwrap_or("");
let id = path_str.parse::<usize>().unwrap_or(0); let id = path_str.parse::<usize>().unwrap_or(0);
if self.screens.borrow().contains_key(&id) { if self.screens.contains_key(&id) {
Ok(id) Ok(id)
} else { } else {
Err(Error::new(ENOENT)) Err(Error::new(ENOENT))
@ -70,24 +60,22 @@ impl Scheme for DisplayScheme {
} }
} }
fn dup(&self, id: usize) -> Result<usize> { fn dup(&mut self, id: usize) -> Result<usize> {
Ok(id) Ok(id)
} }
fn fevent(&self, id: usize, flags: usize) -> Result<usize> { fn fevent(&mut self, id: usize, flags: usize) -> Result<usize> {
let mut screens = self.screens.borrow_mut(); if let Some(mut screen) = self.screens.get_mut(&id) {
if let Some(mut screen) = screens.get_mut(&id) {
screen.event(flags).and(Ok(id)) screen.event(flags).and(Ok(id))
} else { } else {
Err(Error::new(EBADF)) Err(Error::new(EBADF))
} }
} }
fn fpath(&self, id: usize, buf: &mut [u8]) -> Result<usize> { fn fpath(&mut self, id: usize, buf: &mut [u8]) -> Result<usize> {
let screens = self.screens.borrow();
let path_str = if id == 0 { let path_str = if id == 0 {
format!("display:input") format!("display:input")
} else if let Some(screen) = screens.get(&id) { } else if let Some(screen) = self.screens.get(&id) {
format!("display:{}/{}/{}", id, screen.width(), screen.height()) format!("display:{}/{}/{}", id, screen.width(), screen.height())
} else { } else {
return Err(Error::new(EBADF)); return Err(Error::new(EBADF));
@ -104,10 +92,9 @@ impl Scheme for DisplayScheme {
Ok(i) Ok(i)
} }
fn fsync(&self, id: usize) -> Result<usize> { fn fsync(&mut self, id: usize) -> Result<usize> {
let mut screens = self.screens.borrow_mut(); if let Some(mut screen) = self.screens.get_mut(&id) {
if let Some(mut screen) = screens.get_mut(&id) { if id == self.active {
if id == self.active.get() {
screen.sync(); screen.sync();
} }
Ok(0) Ok(0)
@ -116,22 +103,20 @@ impl Scheme for DisplayScheme {
} }
} }
fn read(&self, id: usize, buf: &mut [u8]) -> Result<usize> { fn read(&mut self, id: usize, buf: &mut [u8]) -> Result<usize> {
let mut screens = self.screens.borrow_mut(); if let Some(mut screen) = self.screens.get_mut(&id) {
if let Some(mut screen) = screens.get_mut(&id) {
screen.read(buf) screen.read(buf)
} else { } else {
Err(Error::new(EBADF)) Err(Error::new(EBADF))
} }
} }
fn write(&self, id: usize, buf: &[u8]) -> Result<usize> { fn write(&mut self, id: usize, buf: &[u8]) -> Result<usize> {
let mut screens = self.screens.borrow_mut();
if id == 0 { if id == 0 {
if buf.len() == 1 && buf[0] >= 0xF4 { if buf.len() == 1 && buf[0] >= 0xF4 {
let new_active = (buf[0] - 0xF4) as usize + 1; let new_active = (buf[0] - 0xF4) as usize + 1;
if let Some(mut screen) = screens.get_mut(&new_active) { if let Some(mut screen) = self.screens.get_mut(&new_active) {
self.active.set(new_active); self.active = new_active;
screen.redraw(); screen.redraw();
} }
Ok(1) Ok(1)
@ -157,12 +142,12 @@ impl Scheme for DisplayScheme {
}; };
if let Some(new_active) = new_active_opt { if let Some(new_active) = new_active_opt {
if let Some(mut screen) = screens.get_mut(&new_active) { if let Some(mut screen) = self.screens.get_mut(&new_active) {
self.active.set(new_active); self.active = new_active;
screen.redraw(); screen.redraw();
} }
} else { } else {
if let Some(mut screen) = screens.get_mut(&self.active.get()) { if let Some(mut screen) = self.screens.get_mut(&self.active) {
screen.input(event); screen.input(event);
} }
} }
@ -170,23 +155,22 @@ impl Scheme for DisplayScheme {
Ok(events.len() * mem::size_of::<Event>()) Ok(events.len() * mem::size_of::<Event>())
} }
} else if let Some(mut screen) = screens.get_mut(&id) { } else if let Some(mut screen) = self.screens.get_mut(&id) {
screen.write(buf, id == self.active.get()) screen.write(buf, id == self.active)
} else { } else {
Err(Error::new(EBADF)) Err(Error::new(EBADF))
} }
} }
fn seek(&self, id: usize, pos: usize, whence: usize) -> Result<usize> { fn seek(&mut self, id: usize, pos: usize, whence: usize) -> Result<usize> {
let mut screens = self.screens.borrow_mut(); if let Some(mut screen) = self.screens.get_mut(&id) {
if let Some(mut screen) = screens.get_mut(&id) {
screen.seek(pos, whence) screen.seek(pos, whence)
} else { } else {
Err(Error::new(EBADF)) Err(Error::new(EBADF))
} }
} }
fn close(&self, _id: usize) -> Result<usize> { fn close(&mut self, _id: usize) -> Result<usize> {
Ok(0) Ok(0)
} }
} }

View file

@ -204,7 +204,7 @@ impl Screen for TextScreen {
Ok(buf.len()) Ok(buf.len())
} }
fn seek(&mut self, pos: usize, whence: usize) -> Result<usize> { fn seek(&mut self, _pos: usize, _whence: usize) -> Result<usize> {
Ok(0) Ok(0)
} }