File tree Expand file tree Collapse file tree 4 files changed +50
-61
lines changed Expand file tree Collapse file tree 4 files changed +50
-61
lines changed Original file line number Diff line number Diff line change 1
1
use crate :: {
2
2
peer:: { Peer , PeerManager } ,
3
+ socket:: NonBlockingSocket ,
3
4
uri:: Protocol ,
4
5
} ;
5
6
use parking_lot:: RwLock ;
6
7
use std:: sync:: Arc ;
7
8
8
- mod registry;
9
- pub ( crate ) use registry:: Registry ;
10
-
11
9
type OnPeerRecvCallback = dyn Fn ( & Peer , & mut [ u8 ] ) ;
12
10
11
+ /// trait to be able to listen on multiple sockets asynchronously
13
12
pub trait Poll : Send {
14
- /// blocks the current thread and listens on multiple registered `NonBlockingSocket`s
13
+ /// blocks the current thread and listens on multiple registered `NonBlockingSocket`' s
15
14
/// at the same time and calls `on_peer_recv` on new packets from peer
16
15
fn poll (
17
16
& mut self ,
@@ -23,6 +22,13 @@ pub trait Poll: Send {
23
22
fn get_registry ( & self ) -> anyhow:: Result < Box < dyn Registry > > ;
24
23
}
25
24
25
+ /// trait that allows others to register socket to `Poll`
26
+ pub trait Registry : Send + Sync {
27
+ // need Sync because parking_lot::RwLock needs inner to be Sync
28
+ fn register ( & self , socket : & NonBlockingSocket ) -> anyhow:: Result < ( ) > ;
29
+ fn deregister ( & self , socket : & NonBlockingSocket ) -> anyhow:: Result < ( ) > ;
30
+ }
31
+
26
32
mod icmp;
27
33
mod udp;
28
34
Original file line number Diff line number Diff line change 1
- use super :: {
2
- registry:: { IcmpRegistry , Registry } ,
3
- Poll ,
4
- } ;
1
+ use super :: { Poll , Registry } ;
5
2
use crate :: {
6
3
peer:: { Peer , PeerManager } ,
7
- socket:: icmp:: IcmpSocket ,
4
+ socket:: { icmp:: IcmpSocket , NonBlockingSocket } ,
8
5
MAX_PACKET_SIZE ,
9
6
} ;
10
7
use parking_lot:: RwLock ;
@@ -49,3 +46,15 @@ impl Poll for IcmpPoll {
49
46
}
50
47
}
51
48
}
49
+
50
+ #[ derive( Debug ) ]
51
+ pub struct IcmpRegistry ;
52
+ // icmp doesn't need a registry because we manage it's poll ourself
53
+ impl Registry for IcmpRegistry {
54
+ fn register ( & self , _socket : & NonBlockingSocket ) -> anyhow:: Result < ( ) > {
55
+ Ok ( ( ) )
56
+ }
57
+ fn deregister ( & self , _socket : & NonBlockingSocket ) -> anyhow:: Result < ( ) > {
58
+ Ok ( ( ) )
59
+ }
60
+ }
Load Diff This file was deleted.
Original file line number Diff line number Diff line change 1
- use super :: {
2
- registry:: { Registry , UdpRegistry } ,
3
- Poll ,
4
- } ;
1
+ use super :: { Poll , Registry } ;
5
2
use crate :: {
6
3
peer:: { Peer , PeerManager } ,
4
+ socket:: { NonBlockingSocket , NonBlockingSocketTrait } ,
7
5
MAX_PACKET_SIZE ,
8
6
} ;
9
- use mio:: Events ;
7
+ use mio:: { unix :: SourceFd , Events , Interest , Token } ;
10
8
use parking_lot:: RwLock ;
11
9
use std:: sync:: Arc ;
12
10
@@ -48,3 +46,26 @@ impl Poll for UdpPoll {
48
46
}
49
47
}
50
48
}
49
+
50
+ #[ derive( Debug ) ]
51
+ pub struct UdpRegistry ( pub mio:: Registry ) ;
52
+ impl Registry for UdpRegistry {
53
+ fn register ( & self , socket : & NonBlockingSocket ) -> anyhow:: Result < ( ) > {
54
+ let socket = socket. as_udp ( ) . unwrap ( ) ;
55
+ let local_port = socket. local_addr ( ) ?. port ( ) ;
56
+ self . 0 . register (
57
+ & mut SourceFd ( & socket. as_raw_fd ( ) ) ,
58
+ Token ( local_port. into ( ) ) ,
59
+ Interest :: READABLE ,
60
+ ) ?;
61
+ Ok ( ( ) )
62
+ }
63
+
64
+ fn deregister ( & self , socket : & NonBlockingSocket ) -> anyhow:: Result < ( ) > {
65
+ let socket = socket. as_udp ( ) . unwrap ( ) ;
66
+ let raw_fd = socket. as_raw_fd ( ) ;
67
+ let source = & mut SourceFd ( & raw_fd) ;
68
+ self . 0 . deregister ( source) ?;
69
+ Ok ( ( ) )
70
+ }
71
+ }
You can’t perform that action at this time.
0 commit comments