Index: Cargo.toml ================================================================== --- Cargo.toml +++ Cargo.toml @@ -1,8 +1,8 @@ [package] name = "ump-server" -version = "0.3.0" +version = "0.4.0" edition = "2021" license = "0BSD" categories = [ "concurrency", "asynchronous" ] keywords = [ "channel", "threads", "sync", "message-passing" ] repository = "https://repos.qrnch.tech/pub/ump-server" @@ -11,10 +11,11 @@ exclude = [ ".fossil-settings", ".efiles", ".fslckout", "www", + "bacon.toml", "rustfmt.toml" ] [features] default = ["tokio"] @@ -21,20 +22,18 @@ tokio = ["dep:tokio", "dep:async-trait"] tracing = ["dep:tracing"] watchdog = ["dep:parking_lot"] [dependencies] -async-trait = { version = "0.1.77", optional = true } -parking_lot = { version = "0.12.1", optional = true } -# ToDo: Shouldn't need "net", but without it the docs will not build. -# Once this is fixed in tokio, remove "net". -tokio = { version = "1.36.0", features = ["net", "rt"], optional = true } +async-trait = { version = "0.1.82", optional = true } +parking_lot = { version = "0.12.3", optional = true } +tokio = { version = "1.40.0", features = ["rt"], optional = true } tracing = { version = "0.1.40", optional = true } -ump = { version = "0.12.1" } +ump = { version = "0.13.0" } [dev-dependencies] -tokio-test = { version = "0.4.3" } +tokio-test = { version = "0.4.4" } [package.metadata.docs.rs] all-features = true rustdoc-args = ["--cfg", "docsrs", "--generate-link-to-definition"] ADDED bacon.toml Index: bacon.toml ================================================================== --- /dev/null +++ bacon.toml @@ -0,0 +1,130 @@ +# This is a configuration file for the bacon tool +# +# Bacon repository: https://github.com/Canop/bacon +# Complete help on configuration: https://dystroy.org/bacon/config/ +# You can also check bacon's own bacon.toml file +# as an example: https://github.com/Canop/bacon/blob/main/bacon.toml + +# For information about clippy lints, see: +# https://github.com/rust-lang/rust-clippy/blob/master/README.md + +#default_job = "check" +default_job = "clippy-all-pedantic" + +[jobs.check] +command = ["cargo", "check", "--color", "always"] +need_stdout = false + +[jobs.check-all] +command = ["cargo", "check", "--all-targets", "--color", "always"] +need_stdout = false + +# Run clippy on the default target +[jobs.clippy] +command = [ + "cargo", "clippy", + "--color", "always", +] +need_stdout = false + +# Run clippy on all targets +# To disable some lints, you may change the job this way: +# [jobs.clippy-all] +# command = [ +# "cargo", "clippy", +# "--all-targets", +# "--color", "always", +# "--", +# "-A", "clippy::bool_to_int_with_if", +# "-A", "clippy::collapsible_if", +# "-A", "clippy::derive_partial_eq_without_eq", +# ] +# need_stdout = false +[jobs.clippy-all] +command = [ + "cargo", "clippy", + "--all-targets", + "--color", "always", +] +need_stdout = false + +[jobs.clippy-pedantic] +command = [ + "cargo", "clippy", + "--color", "always", + "--", + "-Wclippy::all", + "-Wclippy::pedantic", + "-Wclippy::nursery", + "-Wclippy::cargo" +] +need_stdout = false + +[jobs.clippy-all-pedantic] +command = [ + "cargo", "clippy", + "--all-targets", + "--color", "always", + "--", + "-Wclippy::all", + "-Wclippy::pedantic", + "-Wclippy::nursery", + "-Wclippy::cargo" +] +need_stdout = false + +# This job lets you run +# - all tests: bacon test +# - a specific test: bacon test -- config::test_default_files +# - the tests of a package: bacon test -- -- -p config +[jobs.test] +command = [ + "cargo", "test", "--color", "always", + "--", "--color", "always", # see https://github.com/Canop/bacon/issues/124 +] +need_stdout = true + +[jobs.doc] +command = ["cargo", "doc", "--color", "always", "--no-deps"] +need_stdout = false + +# If the doc compiles, then it opens in your browser and bacon switches +# to the previous job +[jobs.doc-open] +command = ["cargo", "doc", "--color", "always", "--no-deps", "--open"] +need_stdout = false +on_success = "back" # so that we don't open the browser at each change + +# You can run your application and have the result displayed in bacon, +# *if* it makes sense for this crate. +# Don't forget the `--color always` part or the errors won't be +# properly parsed. +# If your program never stops (eg a server), you may set `background` +# to false to have the cargo run output immediately displayed instead +# of waiting for program's end. +[jobs.run] +command = [ + "cargo", "run", + "--color", "always", + # put launch parameters for your program behind a `--` separator +] +need_stdout = true +allow_warnings = true +background = true + +# This parameterized job runs the example of your choice, as soon +# as the code compiles. +# Call it as +# bacon ex -- my-example +[jobs.ex] +command = ["cargo", "run", "--color", "always", "--example"] +need_stdout = true +allow_warnings = true + +# You may define here keybindings that would be specific to +# a project, for example a shortcut to launch a specific job. +# Shortcuts to internal functions (scrolling, toggling, etc.) +# should go in your personal global prefs.toml file instead. +[keybindings] +# alt-m = "job:my-job" +c = "job:clippy-all" # comment this to have 'c' run clippy on only the default target Index: examples/wdog_timeout.rs ================================================================== --- examples/wdog_timeout.rs +++ examples/wdog_timeout.rs @@ -3,11 +3,11 @@ #[derive(Debug)] pub enum Request { Delay(u64) } -#[derive(Debug, PartialEq)] +#[derive(Debug, PartialEq, Eq)] pub enum Reply { DelayDone } pub struct ThreadedServer {} Index: src/task.rs ================================================================== --- src/task.rs +++ src/task.rs @@ -110,10 +110,14 @@ /// Run a task which will process incoming messages from an ump server /// end-point. /// /// See top module's documentation for an overview of the [dispatch /// loop](crate#dispatch-loop). +/// +/// # Errors +/// An application-defined error `E` is returned if the dispatch loop is +/// terminated by a handler returning `ControlFlow::Break(E)`. #[allow(clippy::type_complexity)] pub fn spawn( hbldr: impl FnOnce(&Client) -> Result ) -> Result<(Client, JoinHandle>), E> where @@ -146,11 +150,11 @@ #[cfg(feature = "watchdog")] wdog.end_process(); match res { - ControlFlow::Continue(_) => {} + ControlFlow::Continue(()) => {} ControlFlow::Break(rv) => break Some(rv) } }; #[cfg(feature = "watchdog")] Index: src/thread.rs ================================================================== --- src/thread.rs +++ src/thread.rs @@ -101,10 +101,14 @@ /// Run a thread which will process incoming messages from an ump server /// end-point. /// /// See top module's documentation for an overview of the [dispatch /// loop](crate#dispatch-loop). +/// +/// # Errors +/// An application-defined error `E` is returned if the dispatch loop is +/// terminated by a handler returning `ControlFlow::Break(E)`. #[allow(clippy::type_complexity)] pub fn spawn( hbldr: impl FnOnce(&Client) -> Result ) -> Result<(Client, thread::JoinHandle>), E> where @@ -137,11 +141,11 @@ #[cfg(feature = "watchdog")] wdog.end_process(); match res { - ControlFlow::Continue(_) => {} + ControlFlow::Continue(()) => {} ControlFlow::Break(rv) => break Some(rv) } }; #[cfg(feature = "watchdog")] Index: src/wdog.rs ================================================================== --- src/wdog.rs +++ src/wdog.rs @@ -31,26 +31,26 @@ struct Shared { inner: Mutex, signal: Condvar } -pub(crate) fn run() -> WatchDog { +pub fn run() -> WatchDog { let inner = Inner { state: State::Idle }; let shared = Shared { inner: Mutex::new(inner), signal: Condvar::new() }; let sh = Arc::new(shared); let shared = Arc::clone(&sh); - let jh = std::thread::spawn(|| monitor_thread(shared)); + let jh = std::thread::spawn(move || monitor_thread(&shared)); WatchDog { sh, jh } } -pub(crate) struct WatchDog { +pub struct WatchDog { sh: Arc, jh: JoinHandle<()> } impl WatchDog { @@ -58,16 +58,18 @@ let mut g = self.sh.inner.lock(); g.state = State::Processing { start_time: Instant::now() }; self.sh.signal.notify_one(); + drop(g); } pub(crate) fn end_process(&self) { let mut g = self.sh.inner.lock(); g.state = State::Idle; self.sh.signal.notify_one(); + drop(g); } pub(crate) fn kill(self) -> std::thread::Result<()> { let mut g = self.sh.inner.lock(); g.state = State::Term; @@ -76,11 +78,12 @@ self.jh.join() } } -fn monitor_thread(sh: Arc) { +#[allow(clippy::significant_drop_tightening)] +fn monitor_thread(sh: &Arc) { let mut g = sh.inner.lock(); loop { match g.state { State::Idle => { // Wait to be notified about a state change Index: tests/common/mod.rs ================================================================== --- tests/common/mod.rs +++ tests/common/mod.rs @@ -4,11 +4,11 @@ pub enum Request { Add(u32, u32), Croak } -#[derive(Debug, PartialEq)] +#[derive(Debug, PartialEq, Eq)] pub enum Reply { Sum(u64), OkIWillCroak } @@ -21,11 +21,11 @@ msg: Request, rctx: ump_server::ReplyContext ) -> ControlFlow { match msg { Request::Add(a, b) => { - rctx.reply(Reply::Sum((a + b) as u64)).unwrap(); + rctx.reply(Reply::Sum(u64::from(a + b))).unwrap(); ControlFlow::Continue(()) } Request::Croak => { rctx.reply(Reply::OkIWillCroak).unwrap(); ControlFlow::Break(42) @@ -45,11 +45,11 @@ msg: Request, rctx: ump_server::ReplyContext ) -> ControlFlow { match msg { Request::Add(a, b) => { - rctx.reply(Reply::Sum((a + b) as u64)).unwrap(); + rctx.reply(Reply::Sum(u64::from(a + b))).unwrap(); ControlFlow::Continue(()) } Request::Croak => { rctx.reply(Reply::OkIWillCroak).unwrap(); ControlFlow::Break(42) Index: www/changelog.md ================================================================== --- www/changelog.md +++ www/changelog.md @@ -1,17 +1,29 @@ # Change Log +⚠️ indicates a breaking change. + ## [Unreleased] -[Details](/vdiff?from=ump-server-0.3.0&to=trunk) +[Details](/vdiff?from=ump-server-0.4.0&to=trunk) ### Added ### Changed ### Removed +--- + +## [0.4.0] - 2024-09-10 + +[Details](/vdiff?from=ump-server-0.3.0&to=ump-server-0.4.0) + +### Changed + +- ⚠️ Updated to `ump` to `0.13.0`. + --- ## [0.3.0] - 2024-02-20 [Details](/vdiff?from=ump-server-0.2.1&to=ump-server-0.3.0) Index: www/index.md ================================================================== --- www/index.md +++ www/index.md @@ -10,10 +10,11 @@ currently requires nightly featuers. To build the documentation locally use: ``` RUSTFLAGS="--cfg docsrs" RUSTDOCFLAGS="--cfg docsrs" cargo +nightly doc --all-features ``` + ## Change log The details of changes can always be found in the timeline, but for a high-level view of changes between released versions there's a manually