feat(init): supervise servers+session progs: restart on death, same endpoint, backoff 0/1/5/30s then give up, restarts_clients cascade; release grants/spawn at stop (stale-slot safe); storage death fatal; init output via printer thread (never blocks on log); terminal Ctrl+C via CONTROL-badged copy, latest wins; flaky test server + spawntest restart/backoff check
This commit is contained in:
14
crates/apps/flaky/Cargo.toml
Normal file
14
crates/apps/flaky/Cargo.toml
Normal file
@@ -0,0 +1,14 @@
|
||||
[package]
|
||||
name = "flaky"
|
||||
version = "0.1.0"
|
||||
edition = "2024"
|
||||
|
||||
[[bin]]
|
||||
name = "flaky"
|
||||
test = false
|
||||
bench = false
|
||||
|
||||
[dependencies]
|
||||
types = { workspace = true }
|
||||
libkos = { workspace = true }
|
||||
server-framework = { workspace = true }
|
||||
69
crates/apps/flaky/src/lib.rs
Normal file
69
crates/apps/flaky/src/lib.rs
Normal file
@@ -0,0 +1,69 @@
|
||||
//! A server that dies or hangs when asked: on the test image only, so the
|
||||
//! self-test can watch init restart it (see init's supervise.rs).
|
||||
|
||||
#![no_std]
|
||||
#![forbid(unsafe_code)]
|
||||
|
||||
use libkos::syscall;
|
||||
use server_framework::{Decode, Encode, MALFORMED, Server};
|
||||
use types::bounded::CapSlot;
|
||||
|
||||
/// Requests (word 0); a reply carries how many requests this instance has
|
||||
/// served, this one included: a restarted server starts at 1.
|
||||
pub mod op {
|
||||
pub const WHO: usize = 1;
|
||||
/// Panics: the process dies.
|
||||
pub const CRASH: usize = 2;
|
||||
/// Blocks for good inside the handler.
|
||||
pub const HANG: usize = 3;
|
||||
}
|
||||
|
||||
/// Everything goes through `handle_call`.
|
||||
struct Never;
|
||||
|
||||
impl Decode for Never {
|
||||
fn decode(_: [usize; 4]) -> Option<Self> {
|
||||
None
|
||||
}
|
||||
}
|
||||
|
||||
impl Encode for Never {
|
||||
fn encode(&self) -> [usize; 4] {
|
||||
[MALFORMED, 0, 0, 0]
|
||||
}
|
||||
}
|
||||
|
||||
struct Flaky {
|
||||
served: usize,
|
||||
}
|
||||
|
||||
impl Server for Flaky {
|
||||
type Request = Never;
|
||||
type Response = Never;
|
||||
|
||||
fn handle(&mut self, request: Never) -> Never {
|
||||
request
|
||||
}
|
||||
|
||||
fn handle_call(&mut self, _badge: usize, words: [usize; 4], _cap: Option<CapSlot>) -> ([usize; 4], Option<syscall::Give>) {
|
||||
match words[0] {
|
||||
op::WHO => {}
|
||||
op::CRASH => panic!("asked to crash"),
|
||||
op::HANG => {
|
||||
// A notification nobody signals.
|
||||
if let Ok(never) = syscall::create_notification() {
|
||||
loop {
|
||||
let _ = syscall::wait(never);
|
||||
}
|
||||
}
|
||||
}
|
||||
_ => return ([MALFORMED, 0, 0, 0], None),
|
||||
}
|
||||
self.served += 1;
|
||||
([self.served, 0, 0, 0], None)
|
||||
}
|
||||
}
|
||||
|
||||
pub fn run() -> ! {
|
||||
server_framework::serve(&mut Flaky { served: 0 }, CapSlot::const_new(0))
|
||||
}
|
||||
11
crates/apps/flaky/src/main.rs
Normal file
11
crates/apps/flaky/src/main.rs
Normal file
@@ -0,0 +1,11 @@
|
||||
#![no_std]
|
||||
#![forbid(unsafe_code)]
|
||||
#![no_main]
|
||||
|
||||
extern crate libkos;
|
||||
|
||||
libkos::entry!(main);
|
||||
|
||||
fn main() {
|
||||
flaky::run();
|
||||
}
|
||||
Reference in New Issue
Block a user