r8125d: rewrite event loop against the real EventQueue/NetworkScheme API

This commit is contained in:
2026-08-05 09:41:46 +03:00
parent f522dc497f
commit 656fa6b88b
@@ -106,51 +106,49 @@ mod redox_main {
std::process::exit(1);
}
let inner = scheme.inner();
let mut running = true;
while running {
let event_count = match event_queue.run() {
Ok(count) => count,
Err(err) => {
log::error!("redbear-r8125d: event queue run failed: {err}");
break;
}
};
if let Err(err) = libredox::call::setrens(0, 0) {
log::error!("redbear-r8125d: failed to enter null namespace: {err}");
std::process::exit(1);
}
if event_count == 0 {
log::warn!("redbear-r8125d: event count is zero, timeout");
continue;
if let Err(err) = scheme.tick() {
log::error!("redbear-r8125d: initial scheme tick failed: {err}");
std::process::exit(1);
}
for event in event_queue.map(|e| match e {
Ok(ev) => ev,
Err(err) => {
log::error!("redbear-r8125d: failed to get next event: {err}");
std::process::exit(1);
}
let inner = &mut *inner;
// Handle scheme events before IRQ so pending reads don't starve.
if event_queue
.event_handle(Source::Scheme)
.map_or(false, |_| scheme.event_count() > 0)
{
match scheme.handle_events() {
Ok(still_running) => running = still_running,
Err(err) => {
log::error!("redbear-r8125d: scheme handle_events failed: {err}");
running = false;
}) {
match event.user_data {
Source::Irq => {
let mut irq = [0; 8];
if let Err(err) = irq_file.irq_handle().read(&mut irq) {
log::error!("redbear-r8125d: IRQ read failed: {err}");
break;
}
let ours = unsafe { scheme.adapter_mut().irq_handler() };
// The kernel masks the IRQ line on delivery and only
// re-arms it on write-back; ack unconditionally or a
// foreign interrupt on a shared line leaves it masked.
if let Err(err) = irq_file.irq_handle().write(&mut irq) {
log::error!("redbear-r8125d: IRQ write-back failed: {err}");
break;
}
if ours && let Err(err) = scheme.tick() {
log::error!("redbear-r8125d: scheme tick after IRQ failed: {err}");
break;
}
}
}
if event_queue
.event_handle(Source::Irq)
.map_or(false, |_| {
irq_file
.irq_handle()
.read(&mut [0u8; 8])
.unwrap_or(0) > 0
})
{
unsafe {
inner.irq_handler();
Source::Scheme => {
if let Err(err) = scheme.tick() {
log::error!("redbear-r8125d: scheme tick failed: {err}");
break;
}
}
scheme.signal_read();
}
}