@@ -34,6 +34,7 @@ use super::packet::{BIG_PACKET_HOP_DATA_LEN, ForwardControlTlvs, Packet, Payload
34
34
use crate :: util:: async_poll:: { MultiResultFuturePoller , ResultFuture } ;
35
35
use crate :: util:: logger:: { Logger , WithContext } ;
36
36
use crate :: util:: ser:: Writeable ;
37
+ use crate :: util:: wakers:: { Future , Notifier } ;
37
38
38
39
use core:: fmt;
39
40
use core:: ops:: Deref ;
@@ -266,6 +267,9 @@ pub struct OnionMessenger<
266
267
pending_intercepted_msgs_events : Mutex < Vec < Event > > ,
267
268
pending_peer_connected_events : Mutex < Vec < Event > > ,
268
269
pending_events_processor : AtomicBool ,
270
+ /// A [`Notifier`] used to wake up the background processor in case we have any [`Event`]s for
271
+ /// it to give to users.
272
+ event_notifier : Notifier ,
269
273
}
270
274
271
275
/// [`OnionMessage`]s buffered to be sent.
@@ -290,13 +294,19 @@ impl OnionMessageRecipient {
290
294
}
291
295
}
292
296
293
- fn enqueue_message ( & mut self , message : OnionMessage ) {
297
+ // Returns whether changes were made that are pending event processing
298
+ fn enqueue_message ( & mut self , message : OnionMessage ) -> bool {
299
+ let mut pending_event_processing = false ;
294
300
let pending_messages = match self {
295
301
OnionMessageRecipient :: ConnectedPeer ( pending_messages) => pending_messages,
296
- OnionMessageRecipient :: PendingConnection ( pending_messages, _, _) => pending_messages,
302
+ OnionMessageRecipient :: PendingConnection ( pending_messages, _, _) => {
303
+ pending_event_processing = true ;
304
+ pending_messages
305
+ }
297
306
} ;
298
307
299
308
pending_messages. push_back ( message) ;
309
+ pending_event_processing
300
310
}
301
311
302
312
fn dequeue_message ( & mut self ) -> Option < OnionMessage > {
@@ -1037,6 +1047,7 @@ macro_rules! drop_handled_events_and_abort { ($self: expr, $res: expr, $offset:
1037
1047
if $res. iter( ) . any( |r| r. is_err( ) ) {
1038
1048
// We failed handling some events. Return to have them eventually replayed.
1039
1049
$self. pending_events_processor. store( false , Ordering :: Release ) ;
1050
+ $self. event_notifier. notify( ) ;
1040
1051
return ;
1041
1052
}
1042
1053
}
@@ -1119,6 +1130,7 @@ where
1119
1130
pending_intercepted_msgs_events : Mutex :: new ( Vec :: new ( ) ) ,
1120
1131
pending_peer_connected_events : Mutex :: new ( Vec :: new ( ) ) ,
1121
1132
pending_events_processor : AtomicBool :: new ( false ) ,
1133
+ event_notifier : Notifier :: new ( ) ,
1122
1134
}
1123
1135
}
1124
1136
@@ -1228,13 +1240,19 @@ where
1228
1240
hash_map:: Entry :: Vacant ( e) => match addresses {
1229
1241
None => Err ( SendError :: InvalidFirstHop ( first_node_id) ) ,
1230
1242
Some ( addresses) => {
1231
- e. insert ( OnionMessageRecipient :: pending_connection ( addresses) )
1243
+ let notify = e. insert ( OnionMessageRecipient :: pending_connection ( addresses) )
1232
1244
. enqueue_message ( onion_message) ;
1245
+ if notify {
1246
+ self . event_notifier . notify ( ) ;
1247
+ }
1233
1248
Ok ( SendSuccess :: BufferedAwaitingConnection ( first_node_id) )
1234
1249
} ,
1235
1250
} ,
1236
1251
hash_map:: Entry :: Occupied ( mut e) => {
1237
- e. get_mut ( ) . enqueue_message ( onion_message) ;
1252
+ let notify = e. get_mut ( ) . enqueue_message ( onion_message) ;
1253
+ if notify {
1254
+ self . event_notifier . notify ( ) ;
1255
+ }
1238
1256
if e. get ( ) . is_connected ( ) {
1239
1257
Ok ( SendSuccess :: Buffered )
1240
1258
} else {
@@ -1345,6 +1363,18 @@ where
1345
1363
return
1346
1364
}
1347
1365
pending_intercepted_msgs_events. push ( event) ;
1366
+ self . event_notifier . notify ( ) ;
1367
+ }
1368
+
1369
+ /// Gets a [`Future`] that completes when an event is available via
1370
+ /// [`EventsProvider::process_pending_events`] or [`Self::process_pending_events_async`].
1371
+ ///
1372
+ /// Note that callbacks registered on the [`Future`] MUST NOT call back into this
1373
+ /// [`OnionMessenger`] and should instead register actions to be taken later.
1374
+ ///
1375
+ /// [`EventsProvider::process_pending_events`]: crate::events::EventsProvider::process_pending_events
1376
+ pub fn get_update_future ( & self ) -> Future {
1377
+ self . event_notifier . get_future ( )
1348
1378
}
1349
1379
1350
1380
/// Processes any events asynchronously using the given handler.
@@ -1616,6 +1646,7 @@ where
1616
1646
pending_peer_connected_events. push (
1617
1647
Event :: OnionMessagePeerConnected { peer_node_id : * their_node_id }
1618
1648
) ;
1649
+ self . event_notifier . notify ( ) ;
1619
1650
}
1620
1651
} else {
1621
1652
self . message_recipients . lock ( ) . unwrap ( ) . remove ( their_node_id) ;
0 commit comments