@@ -27,15 +27,15 @@ use crate::util::chacha20::ChaCha20;
2727
2828use crate :: io;
2929use crate :: prelude:: * ;
30- use crate :: sync:: { Mutex , MutexGuard } ;
30+ use crate :: sync:: { Mutex } ;
3131use alloc:: collections:: BinaryHeap ;
3232use core:: { cmp, fmt} ;
33- use core:: ops:: Deref ;
33+ use core:: ops:: { Deref , DerefMut } ;
3434
3535/// A [`Router`] implemented using [`find_route`].
3636pub struct DefaultRouter < G : Deref < Target = NetworkGraph < L > > , L : Deref , S : Deref , SP : Sized , Sc : Score < ScoreParams = SP > > where
3737 L :: Target : Logger ,
38- S :: Target : for < ' a > LockableScore < ' a , Locked = MutexGuard < ' a , Sc > > ,
38+ S :: Target : for < ' a > LockableScore < ' a , Locked = ' a + DerefMut < Target = Sc > > ,
3939{
4040 network_graph : G ,
4141 logger : L ,
@@ -46,7 +46,7 @@ pub struct DefaultRouter<G: Deref<Target = NetworkGraph<L>>, L: Deref, S: Deref,
4646
4747impl < G : Deref < Target = NetworkGraph < L > > , L : Deref , S : Deref , SP : Sized , Sc : Score < ScoreParams = SP > > DefaultRouter < G , L , S , SP , Sc > where
4848 L :: Target : Logger ,
49- S :: Target : for < ' a > LockableScore < ' a , Locked = MutexGuard < ' a , Sc > > ,
49+ S :: Target : for < ' a > LockableScore < ' a , Locked = ' a + DerefMut < Target = Sc > > ,
5050{
5151 /// Creates a new router.
5252 pub fn new ( network_graph : G , logger : L , random_seed_bytes : [ u8 ; 32 ] , scorer : S , score_params : SP ) -> Self {
@@ -57,7 +57,7 @@ impl<G: Deref<Target = NetworkGraph<L>>, L: Deref, S: Deref, SP: Sized, Sc: Scor
5757
5858impl < G : Deref < Target = NetworkGraph < L > > , L : Deref , S : Deref , SP : Sized , Sc : Score < ScoreParams = SP > > Router for DefaultRouter < G , L , S , SP , Sc > where
5959 L :: Target : Logger ,
60- S :: Target : for < ' a > LockableScore < ' a , Locked = MutexGuard < ' a , Sc > > ,
60+ S :: Target : for < ' a > LockableScore < ' a , Locked = ' a + DerefMut < Target = Sc > > ,
6161{
6262 fn find_route (
6363 & self ,
@@ -71,9 +71,10 @@ impl< G: Deref<Target = NetworkGraph<L>>, L: Deref, S: Deref, SP: Sized, Sc: Sc
7171 * locked_random_seed_bytes = Sha256 :: hash ( & * locked_random_seed_bytes) . into_inner ( ) ;
7272 * locked_random_seed_bytes
7373 } ;
74+ let scorer: Box < dyn DerefMut < Target = Sc > > = Box :: new ( self . scorer . lock ( ) ) ;
7475 find_route (
7576 payer, params, & self . network_graph , first_hops, & * self . logger ,
76- & ScorerAccountingForInFlightHtlcs :: new ( self . scorer . lock ( ) , inflight_htlcs) ,
77+ & ScorerAccountingForInFlightHtlcs :: new ( scorer, inflight_htlcs) ,
7778 & self . score_params ,
7879 & random_seed_bytes
7980 )
@@ -104,15 +105,15 @@ pub trait Router {
104105/// [`find_route`].
105106///
106107/// [`Score`]: crate::routing::scoring::Score
107- pub struct ScorerAccountingForInFlightHtlcs < ' a , S : Score > {
108- scorer : S ,
108+ pub struct ScorerAccountingForInFlightHtlcs < ' a , S : Score < ScoreParams = SP > , SP : Sized > {
109+ scorer : Box < dyn DerefMut < Target = S > > ,
109110 // Maps a channel's short channel id and its direction to the liquidity used up.
110111 inflight_htlcs : & ' a InFlightHtlcs ,
111112}
112113
113- impl < ' a , S : Score > ScorerAccountingForInFlightHtlcs < ' a , S > {
114+ impl < ' a , S : Score < ScoreParams = SP > , SP : Sized > ScorerAccountingForInFlightHtlcs < ' a , S , SP > {
114115 /// Initialize a new `ScorerAccountingForInFlightHtlcs`.
115- pub fn new ( scorer : S , inflight_htlcs : & ' a InFlightHtlcs ) -> Self {
116+ pub fn new ( scorer : Box < dyn DerefMut < Target = S > > , inflight_htlcs : & ' a InFlightHtlcs ) -> Self {
116117 ScorerAccountingForInFlightHtlcs {
117118 scorer,
118119 inflight_htlcs
@@ -125,7 +126,7 @@ impl<'a, S: Score> Writeable for ScorerAccountingForInFlightHtlcs<'a, S> {
125126 fn write < W : Writer > ( & self , writer : & mut W ) -> Result < ( ) , io:: Error > { self . scorer . write ( writer) }
126127}
127128
128- impl < ' a , S : Score > Score for ScorerAccountingForInFlightHtlcs < ' a , S > {
129+ impl < ' a , S : Score < ScoreParams = SP > , SP : Sized > Score for ScorerAccountingForInFlightHtlcs < ' a , S , SP > {
129130 type ScoreParams = S :: ScoreParams ;
130131 fn channel_penalty_msat ( & self , short_channel_id : u64 , source : & NodeId , target : & NodeId , usage : ChannelUsage , score_params : & Self :: ScoreParams ) -> u64 {
131132 if let Some ( used_liquidity) = self . inflight_htlcs . used_liquidity_msat (
0 commit comments