@@ -26,6 +26,8 @@ use lightning::util::ser::{Readable, ReadableArgs, Writeable, Writer};
26
26
use bitcoin:: blockdata:: locktime:: absolute:: LockTime ;
27
27
use bitcoin:: secp256k1:: PublicKey ;
28
28
use bitcoin:: OutPoint ;
29
+ use core:: future:: Future ;
30
+ use core:: task:: { Poll , Waker } ;
29
31
use rand:: { thread_rng, Rng } ;
30
32
use std:: collections:: VecDeque ;
31
33
use std:: ops:: Deref ;
@@ -125,7 +127,8 @@ pub struct EventQueue<K: KVStore + Sync + Send, L: Deref>
125
127
where
126
128
L :: Target : Logger ,
127
129
{
128
- queue : Mutex < VecDeque < Event > > ,
130
+ queue : Arc < Mutex < VecDeque < Event > > > ,
131
+ waker : Arc < Mutex < Option < Waker > > > ,
129
132
notifier : Condvar ,
130
133
kv_store : Arc < K > ,
131
134
logger : L ,
@@ -136,9 +139,10 @@ where
136
139
L :: Target : Logger ,
137
140
{
138
141
pub ( crate ) fn new ( kv_store : Arc < K > , logger : L ) -> Self {
139
- let queue: Mutex < VecDeque < Event > > = Mutex :: new ( VecDeque :: new ( ) ) ;
142
+ let queue = Arc :: new ( Mutex :: new ( VecDeque :: new ( ) ) ) ;
143
+ let waker = Arc :: new ( Mutex :: new ( None ) ) ;
140
144
let notifier = Condvar :: new ( ) ;
141
- Self { queue, notifier, kv_store, logger }
145
+ Self { queue, waker , notifier, kv_store, logger }
142
146
}
143
147
144
148
pub ( crate ) fn add_event ( & self , event : Event ) -> Result < ( ) , Error > {
@@ -149,6 +153,10 @@ where
149
153
}
150
154
151
155
self . notifier . notify_one ( ) ;
156
+
157
+ if let Some ( waker) = self . waker . lock ( ) . unwrap ( ) . take ( ) {
158
+ waker. wake ( ) ;
159
+ }
152
160
Ok ( ( ) )
153
161
}
154
162
@@ -157,6 +165,10 @@ where
157
165
locked_queue. front ( ) . map ( |e| e. clone ( ) )
158
166
}
159
167
168
+ pub ( crate ) async fn next_event_async ( & self ) -> Event {
169
+ EventFuture { event_queue : Arc :: clone ( & self . queue ) , waker : Arc :: clone ( & self . waker ) } . await
170
+ }
171
+
160
172
pub ( crate ) fn wait_next_event ( & self ) -> Event {
161
173
let locked_queue =
162
174
self . notifier . wait_while ( self . queue . lock ( ) . unwrap ( ) , |queue| queue. is_empty ( ) ) . unwrap ( ) ;
@@ -170,6 +182,10 @@ where
170
182
self . persist_queue ( & locked_queue) ?;
171
183
}
172
184
self . notifier . notify_one ( ) ;
185
+
186
+ if let Some ( waker) = self . waker . lock ( ) . unwrap ( ) . take ( ) {
187
+ waker. wake ( ) ;
188
+ }
173
189
Ok ( ( ) )
174
190
}
175
191
@@ -207,9 +223,10 @@ where
207
223
) -> Result < Self , lightning:: ln:: msgs:: DecodeError > {
208
224
let ( kv_store, logger) = args;
209
225
let read_queue: EventQueueDeserWrapper = Readable :: read ( reader) ?;
210
- let queue: Mutex < VecDeque < Event > > = Mutex :: new ( read_queue. 0 ) ;
226
+ let queue = Arc :: new ( Mutex :: new ( read_queue. 0 ) ) ;
227
+ let waker = Arc :: new ( Mutex :: new ( None ) ) ;
211
228
let notifier = Condvar :: new ( ) ;
212
- Ok ( Self { queue, notifier, kv_store, logger } )
229
+ Ok ( Self { queue, waker , notifier, kv_store, logger } )
213
230
}
214
231
}
215
232
@@ -240,6 +257,26 @@ impl Writeable for EventQueueSerWrapper<'_> {
240
257
}
241
258
}
242
259
260
+ struct EventFuture {
261
+ event_queue : Arc < Mutex < VecDeque < Event > > > ,
262
+ waker : Arc < Mutex < Option < Waker > > > ,
263
+ }
264
+
265
+ impl Future for EventFuture {
266
+ type Output = Event ;
267
+
268
+ fn poll (
269
+ self : core:: pin:: Pin < & mut Self > , cx : & mut core:: task:: Context < ' _ > ,
270
+ ) -> core:: task:: Poll < Self :: Output > {
271
+ if let Some ( event) = self . event_queue . lock ( ) . unwrap ( ) . front ( ) {
272
+ Poll :: Ready ( event. clone ( ) )
273
+ } else {
274
+ * self . waker . lock ( ) . unwrap ( ) = Some ( cx. waker ( ) . clone ( ) ) ;
275
+ Poll :: Pending
276
+ }
277
+ }
278
+ }
279
+
243
280
pub ( crate ) struct EventHandler < K : KVStore + Sync + Send , L : Deref >
244
281
where
245
282
L :: Target : Logger ,
0 commit comments