Migrate to libredox and redox-scheme.

This commit is contained in:
4lDO2
2023-11-16 13:49:44 +01:00
parent 787de5c371
commit b63bb7c012
4 changed files with 91 additions and 63 deletions
Generated
+49 -10
View File
@@ -7,7 +7,9 @@ name = "audiod"
version = "0.1.0"
dependencies = [
"libc",
"libredox 0.0.3",
"redox-daemon",
"redox-scheme",
"redox_syscall",
]
@@ -18,26 +20,63 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
[[package]]
name = "libc"
version = "0.2.147"
name = "bitflags"
version = "2.4.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b4668fb0ea861c1df094127ac5f1da3409a82116a4ba74fca2e58ef927159bb3"
checksum = "327762f6e5a765692301e5bb513e0d9fef63be86bbc14528052b1cd3e6f03e07"
[[package]]
name = "redox-daemon"
version = "0.1.1"
name = "libc"
version = "0.2.150"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "811fd0d382a70c9e9192166ee794567b65ef34cc7309c86a49b071779ca9b5f3"
checksum = "89d92a4743f9a61002fae18374ed11e7973f530cb3a3255fb354818118b2203c"
[[package]]
name = "libredox"
version = "0.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "85c833ca1e66078851dba29046874e38f08b2c883700aa29a03ddd3b23814ee8"
dependencies = [
"bitflags 2.4.1",
"libc",
"redox_syscall",
]
[[package]]
name = "redox_syscall"
version = "0.3.5"
name = "libredox"
version = "0.0.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29"
checksum = "962b650e6b934f95cec493e1464e0f5cba98dd9ba9ef2b1c42cdfdb7864cab5a"
dependencies = [
"bitflags",
"bitflags 2.4.1",
"libc",
"redox_syscall",
]
[[package]]
name = "redox-daemon"
version = "0.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "353178b5771a301b9d2b318914ab5dfeb21dd6e65930faedde19248cfceca5a7"
dependencies = [
"libc",
"libredox 0.0.1",
]
[[package]]
name = "redox-scheme"
version = "0.1.0"
source = "git+https://gitlab.redox-os.org/redox-os/redox-scheme.git#afd3fa573f0a7c03b762ac23daaf06966afecc75"
dependencies = [
"libredox 0.0.3",
"redox_syscall",
]
[[package]]
name = "redox_syscall"
version = "0.4.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa"
dependencies = [
"bitflags 1.3.2",
]
+4 -2
View File
@@ -5,6 +5,8 @@ authors = ["Jeremy Soller <jackpot51@gmail.com>"]
edition = "2018"
[dependencies]
redox-daemon = "0.1.1"
redox_syscall = "0.3"
redox-daemon = "0.1.2"
redox_syscall = "0.4.1"
libc = "0.2"
libredox = "0.0.3"
redox-scheme = { git = "https://gitlab.redox-os.org/redox-os/redox-scheme.git" }
+36 -50
View File
@@ -2,12 +2,12 @@ extern crate syscall;
use std::mem::MaybeUninit;
use std::ptr::addr_of_mut;
use std::{fs, io, mem, process, slice, thread};
use std::io::{Read, Write};
use std::{mem, process, slice, thread};
use std::sync::{Arc, Mutex};
use syscall::data::Packet;
use syscall::scheme::SchemeBlockMut;
use libredox::flag;
use libredox::{Fd, error::Result};
use redox_scheme::{Socket, SignalBehavior};
use redox_daemon::Daemon;
@@ -15,53 +15,45 @@ use self::scheme::AudioScheme;
mod scheme;
fn from_syscall_error(error: syscall::Error) -> io::Error {
io::Error::from_raw_os_error(error.errno as i32)
}
extern "C" fn sigusr_handler(_sig: usize) {}
fn thread(scheme: Arc<Mutex<AudioScheme>>, pid: usize, mut hw_file: fs::File) -> io::Result<()> {
fn thread(scheme: Arc<Mutex<AudioScheme>>, pid: usize, mut hw_file: Fd) -> Result<()> {
// Enter null namespace
syscall::setrens(0, 0).map_err(from_syscall_error)?;
libredox::call::setrens(0, 0)?;
loop {
let buffer = scheme.lock().unwrap().buffer();
let buffer_u8 = unsafe {
slice::from_raw_parts(
buffer.as_ptr() as *const u8,
mem::size_of_val(&buffer)
mem::size_of_val(&buffer),
)
};
// Wake up the scheme thread
syscall::kill(pid, syscall::SIGUSR1).map_err(from_syscall_error)?;
libredox::call::kill(pid, libredox::flag::SIGUSR1 as u32)?;
hw_file.write(&buffer_u8)?;
}
}
fn daemon(daemon: Daemon) -> io::Result<()> {
fn daemon(daemon: Daemon) -> Result<()> {
// Handle signals from the hw thread
unsafe {
let new_sigaction = unsafe {
let mut sigaction = MaybeUninit::<libc::sigaction>::uninit();
addr_of_mut!((*sigaction.as_mut_ptr()).sa_flags).write(0);
libc::sigemptyset(addr_of_mut!((*sigaction.as_mut_ptr()).sa_mask));
addr_of_mut!((*sigaction.as_mut_ptr()).sa_sigaction).write(sigusr_handler as usize);
sigaction.assume_init()
};
libredox::call::sigaction(flag::SIGUSR1, Some(&new_sigaction), None)?;
match libc::sigaction(libc::SIGUSR1, sigaction.as_ptr(), core::ptr::null_mut()) {
0 => (),
-1 => return Err(io::Error::last_os_error()),
_ => unreachable!(),
}
}
let pid = libredox::call::getpid()?;
let pid = syscall::getpid().map_err(from_syscall_error)?;
let hw_file = Fd::open("audiohw:", flag::O_WRONLY | flag::O_CLOEXEC, 0)?;
let hw_file = fs::OpenOptions::new().write(true).open("audiohw:")?;
let mut scheme_file = fs::OpenOptions::new().create(true).read(true).write(true).open(":audio")?;
let socket = Socket::create("audio")?;
let scheme = Arc::new(Mutex::new(AudioScheme::new()));
@@ -71,40 +63,34 @@ fn daemon(daemon: Daemon) -> io::Result<()> {
// Enter the null namespace - done after thread is created so
// memory: can be accessed for stack allocation
syscall::setrens(0, 0).map_err(from_syscall_error)?;
libredox::call::setrens(0, 0)?;
// The scheme is now ready to accept requests, notify the original process
daemon.ready().map_err(from_syscall_error)?;
daemon.ready()?;
let mut todo = Vec::new();
loop {
let mut packet = Packet::default();
let count = match scheme_file.read(&mut packet) {
Ok(ok) => ok,
Err(err) => if err.kind() == io::ErrorKind::Interrupted {
0
} else {
return Err(err);
}
};
let mut pending = Vec::new();
if count > 0 {
if let Some(a) = scheme.lock().unwrap().handle(&mut packet) {
packet.a = a;
scheme_file.write(&packet)?;
} else {
todo.push(packet);
loop {
if let Some(request) = socket.next_request(SignalBehavior::Restart)? {
match request.handle_scheme_block_mut(&mut *scheme.lock().unwrap()) {
Ok(response) => {
socket.write_responses(&[response], SignalBehavior::Restart)?;
}
Err(request) => pending.push(request),
}
}
let mut i = 0;
while i < todo.len() {
if let Some(a) = scheme.lock().unwrap().handle(&mut todo[i]) {
let mut packet = todo.remove(i);
packet.a = a;
scheme_file.write(&packet)?;
} else {
i += 1;
while i < pending.len() {
let request = pending[i];
match request.handle_scheme_block_mut(&mut *scheme.lock().unwrap()) {
Ok(response) => {
pending.remove(i);
socket.write_responses(&[response], SignalBehavior::Restart)?;
}
Err(_) => {
i += 1
}
}
}
}
+2 -1
View File
@@ -2,7 +2,8 @@ use std::collections::{BTreeMap, VecDeque};
use std::str;
use syscall::error::{EBADF, EINVAL, ENOENT, EWOULDBLOCK, Error, Result};
use syscall::flag::O_NONBLOCK;
use syscall::scheme::SchemeBlockMut;
use redox_scheme::SchemeBlockMut;
// The strict buffer size of the audiohw: driver
const HW_BUFFER_SIZE: usize = 512;