Skip to content

Commit 94650bd

Browse files
committed
Require chain::Listen impls in block sync be Send + Sync
Users who want to use `lightning-block-sync`'s `init` module would be reasonable in wanting to use it in a multithreaded environment, however because it takes a list of listeners as `dyn chain::Listen` without any `Send` or `Sync` bound they fail in doing so. Here we add a `Send + Sync` bound, requiring any listeners be both. This could be less generic for users with their own `chain::Listen` listener that is *not* `Send` or `Sync`, but given multi-threading support is important and the LDK-included `chain::Listen` implementations are `Send + Sync`, this seems like an acceptable tradeoff.
1 parent 6259e7a commit 94650bd

File tree

1 file changed

+15
-15
lines changed

1 file changed

+15
-15
lines changed

lightning-block-sync/src/init.rs

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -101,8 +101,8 @@ BlockSourceResult<ValidatedBlockHeader> {
101101
/// let mut cache = UnboundedCache::new();
102102
/// let mut monitor_listener = (monitor, &*tx_broadcaster, &*fee_estimator, &*logger);
103103
/// let listeners = vec![
104-
/// (monitor_block_hash, &monitor_listener as &dyn chain::Listen),
105-
/// (manager_block_hash, &manager as &dyn chain::Listen),
104+
/// (monitor_block_hash, &monitor_listener as &(dyn chain::Listen + Send + Sync)),
105+
/// (manager_block_hash, &manager as &(dyn chain::Listen + Send + Sync)),
106106
/// ];
107107
/// let chain_tip = init::synchronize_listeners(
108108
/// block_source, Network::Bitcoin, &mut cache, listeners).await.unwrap();
@@ -125,7 +125,7 @@ pub async fn synchronize_listeners<B: BlockSource, C: Cache>(
125125
block_source: &mut B,
126126
network: Network,
127127
header_cache: &mut C,
128-
mut chain_listeners: Vec<(BlockHash, &dyn chain::Listen)>,
128+
mut chain_listeners: Vec<(BlockHash, &(dyn chain::Listen + Send + Sync))>,
129129
) -> BlockSourceResult<ValidatedBlockHeader> {
130130
let best_header = validate_best_block_header(block_source).await?;
131131

@@ -198,7 +198,7 @@ impl<'a, C: Cache> Cache for ReadOnlyCache<'a, C> {
198198
}
199199

200200
/// Wrapper for supporting dynamically sized chain listeners.
201-
struct DynamicChainListener<'a>(&'a dyn chain::Listen);
201+
struct DynamicChainListener<'a>(&'a (dyn chain::Listen + Send + Sync));
202202

203203
impl<'a> chain::Listen for DynamicChainListener<'a> {
204204
fn block_connected(&self, _block: &Block, _height: u32) {
@@ -211,7 +211,7 @@ impl<'a> chain::Listen for DynamicChainListener<'a> {
211211
}
212212

213213
/// A set of dynamically sized chain listeners, each paired with a starting block height.
214-
struct ChainListenerSet<'a>(Vec<(u32, &'a dyn chain::Listen)>);
214+
struct ChainListenerSet<'a>(Vec<(u32, &'a (dyn chain::Listen + Send + Sync))>);
215215

216216
impl<'a> chain::Listen for ChainListenerSet<'a> {
217217
fn block_connected(&self, block: &Block, height: u32) {
@@ -249,9 +249,9 @@ mod tests {
249249
.expect_block_connected(*chain.at_height(4));
250250

251251
let listeners = vec![
252-
(chain.at_height(1).block_hash, &listener_1 as &dyn chain::Listen),
253-
(chain.at_height(2).block_hash, &listener_2 as &dyn chain::Listen),
254-
(chain.at_height(3).block_hash, &listener_3 as &dyn chain::Listen),
252+
(chain.at_height(1).block_hash, &listener_1 as &(dyn chain::Listen + Send + Sync)),
253+
(chain.at_height(2).block_hash, &listener_2 as &(dyn chain::Listen + Send + Sync)),
254+
(chain.at_height(3).block_hash, &listener_3 as &(dyn chain::Listen + Send + Sync)),
255255
];
256256
let mut cache = chain.header_cache(0..=4);
257257
match synchronize_listeners(&mut chain, Network::Bitcoin, &mut cache, listeners).await {
@@ -284,9 +284,9 @@ mod tests {
284284
.expect_block_connected(*main_chain.at_height(4));
285285

286286
let listeners = vec![
287-
(fork_chain_1.tip().block_hash, &listener_1 as &dyn chain::Listen),
288-
(fork_chain_2.tip().block_hash, &listener_2 as &dyn chain::Listen),
289-
(fork_chain_3.tip().block_hash, &listener_3 as &dyn chain::Listen),
287+
(fork_chain_1.tip().block_hash, &listener_1 as &(dyn chain::Listen + Send + Sync)),
288+
(fork_chain_2.tip().block_hash, &listener_2 as &(dyn chain::Listen + Send + Sync)),
289+
(fork_chain_3.tip().block_hash, &listener_3 as &(dyn chain::Listen + Send + Sync)),
290290
];
291291
let mut cache = fork_chain_1.header_cache(2..=4);
292292
cache.extend(fork_chain_2.header_cache(3..=4));
@@ -327,9 +327,9 @@ mod tests {
327327
.expect_block_connected(*main_chain.at_height(4));
328328

329329
let listeners = vec![
330-
(fork_chain_1.tip().block_hash, &listener_1 as &dyn chain::Listen),
331-
(fork_chain_2.tip().block_hash, &listener_2 as &dyn chain::Listen),
332-
(fork_chain_3.tip().block_hash, &listener_3 as &dyn chain::Listen),
330+
(fork_chain_1.tip().block_hash, &listener_1 as &(dyn chain::Listen + Send + Sync)),
331+
(fork_chain_2.tip().block_hash, &listener_2 as &(dyn chain::Listen + Send + Sync)),
332+
(fork_chain_3.tip().block_hash, &listener_3 as &(dyn chain::Listen + Send + Sync)),
333333
];
334334
let mut cache = fork_chain_1.header_cache(2..=4);
335335
cache.extend(fork_chain_2.header_cache(3..=4));
@@ -351,7 +351,7 @@ mod tests {
351351
.expect_block_disconnected(*old_tip)
352352
.expect_block_connected(*new_tip);
353353

354-
let listeners = vec![(old_tip.block_hash, &listener as &dyn chain::Listen)];
354+
let listeners = vec![(old_tip.block_hash, &listener as &(dyn chain::Listen + Send + Sync))];
355355
let mut cache = fork_chain.header_cache(2..=2);
356356
match synchronize_listeners(&mut main_chain, Network::Bitcoin, &mut cache, listeners).await {
357357
Ok(_) => {

0 commit comments

Comments
 (0)