@@ -43,7 +43,7 @@ use util::events;
43
43
use util:: events:: Event ;
44
44
45
45
use std:: collections:: { HashMap , hash_map} ;
46
- use std:: sync:: Mutex ;
46
+ use std:: sync:: RwLock ;
47
47
use std:: ops:: Deref ;
48
48
49
49
/// An implementation of [`chain::Watch`] for monitoring channels.
@@ -64,7 +64,7 @@ pub struct ChainMonitor<ChannelSigner: Sign, C: Deref, T: Deref, F: Deref, L: De
64
64
P :: Target : channelmonitor:: Persist < ChannelSigner > ,
65
65
{
66
66
/// The monitors
67
- pub monitors : Mutex < HashMap < OutPoint , ChannelMonitor < ChannelSigner > > > ,
67
+ pub monitors : RwLock < HashMap < OutPoint , ChannelMonitor < ChannelSigner > > > ,
68
68
chain_source : Option < C > ,
69
69
broadcaster : T ,
70
70
logger : L ,
@@ -93,8 +93,8 @@ where C::Target: chain::Filter,
93
93
/// [`chain::Watch::release_pending_monitor_events`]: ../trait.Watch.html#tymethod.release_pending_monitor_events
94
94
/// [`chain::Filter`]: ../trait.Filter.html
95
95
pub fn block_connected ( & self , header : & BlockHeader , txdata : & TransactionData , height : u32 ) {
96
- let mut monitors = self . monitors . lock ( ) . unwrap ( ) ;
97
- for monitor in monitors. values_mut ( ) {
96
+ let monitors = self . monitors . read ( ) . unwrap ( ) ;
97
+ for monitor in monitors. values ( ) {
98
98
let mut txn_outputs = monitor. block_connected ( header, txdata, height, & * self . broadcaster , & * self . fee_estimator , & * self . logger ) ;
99
99
100
100
if let Some ( ref chain_source) = self . chain_source {
@@ -113,8 +113,8 @@ where C::Target: chain::Filter,
113
113
///
114
114
/// [`ChannelMonitor::block_disconnected`]: ../channelmonitor/struct.ChannelMonitor.html#method.block_disconnected
115
115
pub fn block_disconnected ( & self , header : & BlockHeader , disconnected_height : u32 ) {
116
- let mut monitors = self . monitors . lock ( ) . unwrap ( ) ;
117
- for monitor in monitors. values_mut ( ) {
116
+ let monitors = self . monitors . read ( ) . unwrap ( ) ;
117
+ for monitor in monitors. values ( ) {
118
118
monitor. block_disconnected ( header, disconnected_height, & * self . broadcaster , & * self . fee_estimator , & * self . logger ) ;
119
119
}
120
120
}
@@ -130,7 +130,7 @@ where C::Target: chain::Filter,
130
130
/// [`chain::Filter`]: ../trait.Filter.html
131
131
pub fn new ( chain_source : Option < C > , broadcaster : T , logger : L , feeest : F , persister : P ) -> Self {
132
132
Self {
133
- monitors : Mutex :: new ( HashMap :: new ( ) ) ,
133
+ monitors : RwLock :: new ( HashMap :: new ( ) ) ,
134
134
chain_source,
135
135
broadcaster,
136
136
logger,
@@ -177,7 +177,7 @@ where C::Target: chain::Filter,
177
177
///
178
178
/// [`chain::Filter`]: ../trait.Filter.html
179
179
fn watch_channel ( & self , funding_outpoint : OutPoint , monitor : ChannelMonitor < ChannelSigner > ) -> Result < ( ) , ChannelMonitorUpdateErr > {
180
- let mut monitors = self . monitors . lock ( ) . unwrap ( ) ;
180
+ let mut monitors = self . monitors . write ( ) . unwrap ( ) ;
181
181
let entry = match monitors. entry ( funding_outpoint) {
182
182
hash_map:: Entry :: Occupied ( _) => {
183
183
log_error ! ( self . logger, "Failed to add new channel data: channel monitor for given outpoint is already present" ) ;
@@ -209,8 +209,8 @@ where C::Target: chain::Filter,
209
209
/// `ChainMonitor` monitors lock.
210
210
fn update_channel ( & self , funding_txo : OutPoint , update : ChannelMonitorUpdate ) -> Result < ( ) , ChannelMonitorUpdateErr > {
211
211
// Update the monitor that watches the channel referred to by the given outpoint.
212
- let mut monitors = self . monitors . lock ( ) . unwrap ( ) ;
213
- match monitors. get_mut ( & funding_txo) {
212
+ let monitors = self . monitors . read ( ) . unwrap ( ) ;
213
+ match monitors. get ( & funding_txo) {
214
214
None => {
215
215
log_error ! ( self . logger, "Failed to update channel monitor: no such monitor registered" ) ;
216
216
@@ -222,15 +222,15 @@ where C::Target: chain::Filter,
222
222
#[ cfg( not( any( test, feature = "fuzztarget" ) ) ) ]
223
223
Err ( ChannelMonitorUpdateErr :: PermanentFailure )
224
224
} ,
225
- Some ( orig_monitor ) => {
226
- log_trace ! ( self . logger, "Updating Channel Monitor for channel {}" , log_funding_info!( orig_monitor ) ) ;
227
- let update_res = orig_monitor . update_monitor ( & update, & self . broadcaster , & self . fee_estimator , & self . logger ) ;
225
+ Some ( monitor ) => {
226
+ log_trace ! ( self . logger, "Updating Channel Monitor for channel {}" , log_funding_info!( monitor ) ) ;
227
+ let update_res = monitor . update_monitor ( & update, & self . broadcaster , & self . fee_estimator , & self . logger ) ;
228
228
if let Err ( e) = & update_res {
229
229
log_error ! ( self . logger, "Failed to update channel monitor: {:?}" , e) ;
230
230
}
231
231
// Even if updating the monitor returns an error, the monitor's state will
232
232
// still be changed. So, persist the updated monitor despite the error.
233
- let persist_res = self . persister . update_persisted_channel ( funding_txo, & update, orig_monitor ) ;
233
+ let persist_res = self . persister . update_persisted_channel ( funding_txo, & update, monitor ) ;
234
234
if let Err ( ref e) = persist_res {
235
235
log_error ! ( self . logger, "Failed to persist channel monitor update: {:?}" , e) ;
236
236
}
@@ -245,8 +245,8 @@ where C::Target: chain::Filter,
245
245
246
246
fn release_pending_monitor_events ( & self ) -> Vec < MonitorEvent > {
247
247
let mut pending_monitor_events = Vec :: new ( ) ;
248
- for chan in self . monitors . lock ( ) . unwrap ( ) . values_mut ( ) {
249
- pending_monitor_events. append ( & mut chan . get_and_clear_pending_monitor_events ( ) ) ;
248
+ for monitor in self . monitors . read ( ) . unwrap ( ) . values ( ) {
249
+ pending_monitor_events. append ( & mut monitor . get_and_clear_pending_monitor_events ( ) ) ;
250
250
}
251
251
pending_monitor_events
252
252
}
@@ -261,8 +261,8 @@ impl<ChannelSigner: Sign, C: Deref, T: Deref, F: Deref, L: Deref, P: Deref> even
261
261
{
262
262
fn get_and_clear_pending_events ( & self ) -> Vec < Event > {
263
263
let mut pending_events = Vec :: new ( ) ;
264
- for chan in self . monitors . lock ( ) . unwrap ( ) . values_mut ( ) {
265
- pending_events. append ( & mut chan . get_and_clear_pending_events ( ) ) ;
264
+ for monitor in self . monitors . read ( ) . unwrap ( ) . values ( ) {
265
+ pending_events. append ( & mut monitor . get_and_clear_pending_events ( ) ) ;
266
266
}
267
267
pending_events
268
268
}
0 commit comments