Migrate to libredox and redox-scheme.
This commit is contained in:
Generated
+49
-10
@@ -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
@@ -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
@@ -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
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user