From aa4c6f6418d7500307853d125528d65e9170cb15 Mon Sep 17 00:00:00 2001 From: Matt Corallo Date: Tue, 17 Jan 2023 00:16:48 +0000 Subject: [PATCH] Make `background-processor` no-std-friendly (ish) This makes `background-processor` build without `std` at all. This isn't particularly useful in the general no-std case as `background-processor` is only useful with the `futures` feature, and async will generally need `std` in some way or another. Still, it ensures we don't end up reintroducing a dependency on the current time, which breaks `wasm` use-cases. --- lightning-background-processor/Cargo.toml | 9 +++-- lightning-background-processor/src/lib.rs | 44 ++++++++++++++++++----- no-std-check/Cargo.toml | 1 + 3 files changed, 42 insertions(+), 12 deletions(-) diff --git a/lightning-background-processor/Cargo.toml b/lightning-background-processor/Cargo.toml index 343408ea9..96ac33a91 100644 --- a/lightning-background-processor/Cargo.toml +++ b/lightning-background-processor/Cargo.toml @@ -15,11 +15,14 @@ rustdoc-args = ["--cfg", "docsrs"] [features] futures = [ "futures-util" ] +std = ["lightning/std", "lightning-rapid-gossip-sync/std"] + +default = ["std"] [dependencies] -bitcoin = "0.29.0" -lightning = { version = "0.0.113", path = "../lightning", features = ["std"] } -lightning-rapid-gossip-sync = { version = "0.0.113", path = "../lightning-rapid-gossip-sync" } +bitcoin = { version = "0.29.0", default-features = false } +lightning = { version = "0.0.113", path = "../lightning", default-features = false } +lightning-rapid-gossip-sync = { version = "0.0.113", path = "../lightning-rapid-gossip-sync", default-features = false } futures-util = { version = "0.3", default-features = false, features = ["async-await-macro"], optional = true } [dev-dependencies] diff --git a/lightning-background-processor/src/lib.rs b/lightning-background-processor/src/lib.rs index b2ee86547..60a63d853 100644 --- a/lightning-background-processor/src/lib.rs +++ b/lightning-background-processor/src/lib.rs @@ -11,6 +11,11 @@ #![cfg_attr(docsrs, feature(doc_auto_cfg))] +#![cfg_attr(all(not(feature = "std"), not(test)), no_std)] + +#[cfg(any(test, feature = "std"))] +extern crate core; + #[macro_use] extern crate lightning; extern crate lightning_rapid_gossip_sync; @@ -28,12 +33,19 @@ use lightning::util::events::{Event, EventHandler, EventsProvider}; use lightning::util::logger::Logger; use lightning::util::persist::Persister; use lightning_rapid_gossip_sync::RapidGossipSync; +use lightning::io; + +use core::ops::Deref; +use core::time::Duration; + +#[cfg(feature = "std")] use std::sync::Arc; -use std::sync::atomic::{AtomicBool, Ordering}; -use std::thread; -use std::thread::JoinHandle; -use std::time::{Duration, Instant}; -use std::ops::Deref; +#[cfg(feature = "std")] +use core::sync::atomic::{AtomicBool, Ordering}; +#[cfg(feature = "std")] +use std::thread::{self, JoinHandle}; +#[cfg(feature = "std")] +use std::time::Instant; #[cfg(feature = "futures")] use futures_util::{select_biased, future::FutureExt, task}; @@ -62,6 +74,7 @@ use futures_util::{select_biased, future::FutureExt, task}; /// /// [`ChannelMonitor`]: lightning::chain::channelmonitor::ChannelMonitor /// [`Event`]: lightning::util::events::Event +#[cfg(feature = "std")] #[must_use = "BackgroundProcessor will immediately stop on drop. It should be stored until shutdown."] pub struct BackgroundProcessor { stop_thread: Arc, @@ -285,8 +298,14 @@ macro_rules! define_run_body { if $timer_elapsed(&mut last_prune_call, if have_pruned { NETWORK_PRUNE_TIMER } else { FIRST_NETWORK_PRUNE_TIMER }) { // The network graph must not be pruned while rapid sync completion is pending if let Some(network_graph) = $gossip_sync.prunable_network_graph() { - log_trace!($logger, "Pruning and persisting network graph."); - network_graph.remove_stale_channels_and_tracking(); + #[cfg(feature = "std")] { + log_trace!($logger, "Pruning and persisting network graph."); + network_graph.remove_stale_channels_and_tracking(); + } + #[cfg(not(feature = "std"))] { + log_warn!($logger, "Not pruning network graph, consider enabling `std` or doing so manually with remove_stale_channels_and_tracking_with_time."); + log_trace!($logger, "Persisting network graph."); + } if let Err(e) = $persister.persist_graph(network_graph) { log_error!($logger, "Error: Failed to persist network graph, check your disk and permissions {}", e) @@ -334,6 +353,11 @@ macro_rules! define_run_body { /// future which outputs true, the loop will exit and this function's future will complete. /// /// See [`BackgroundProcessor::start`] for information on which actions this handles. +/// +/// Requires the `futures` feature. Note that while this method is available without the `std` +/// feature, doing so will skip calling [`NetworkGraph::remove_stale_channels_and_tracking`], +/// you should call [`NetworkGraph::remove_stale_channels_and_tracking_with_time`] regularly +/// manually instead. #[cfg(feature = "futures")] pub async fn process_events_async< 'a, @@ -370,7 +394,7 @@ pub async fn process_events_async< persister: PS, event_handler: EventHandler, chain_monitor: M, channel_manager: CM, gossip_sync: GossipSync, peer_manager: PM, logger: L, scorer: Option, sleeper: Sleeper, -) -> Result<(), std::io::Error> +) -> Result<(), io::Error> where CA::Target: 'static + chain::Access, CF::Target: 'static + chain::Filter, @@ -419,6 +443,7 @@ where }) } +#[cfg(feature = "std")] impl BackgroundProcessor { /// Start a background thread that takes care of responsibilities enumerated in the [top-level /// documentation]. @@ -574,13 +599,14 @@ impl BackgroundProcessor { } } +#[cfg(feature = "std")] impl Drop for BackgroundProcessor { fn drop(&mut self) { self.stop_and_join_thread().unwrap(); } } -#[cfg(test)] +#[cfg(all(feature = "std", test))] mod tests { use bitcoin::blockdata::block::BlockHeader; use bitcoin::blockdata::constants::genesis_block; diff --git a/no-std-check/Cargo.toml b/no-std-check/Cargo.toml index 947838633..cb22dcea9 100644 --- a/no-std-check/Cargo.toml +++ b/no-std-check/Cargo.toml @@ -10,3 +10,4 @@ default = ["lightning/no-std", "lightning-invoice/no-std", "lightning-rapid-goss lightning = { path = "../lightning", default-features = false } lightning-invoice = { path = "../lightning-invoice", default-features = false } lightning-rapid-gossip-sync = { path = "../lightning-rapid-gossip-sync", default-features = false } +lightning-background-processor = { path = "../lightning-background-processor", features = ["futures"], default-features = false } -- 2.39.5