1- use crate :: notify_once:: NotifyOnce ;
1+ use crate :: { notify_once:: NotifyOnce , server :: Address } ;
22use std:: {
3- net:: SocketAddr ,
43 sync:: {
54 atomic:: { AtomicUsize , Ordering } ,
65 Arc , Mutex ,
@@ -10,14 +9,22 @@ use std::{
109use tokio:: { sync:: Notify , time:: sleep} ;
1110
1211/// A handle for [`Server`](crate::server::Server).
13- #[ derive( Clone , Debug , Default ) ]
14- pub struct Handle {
15- inner : Arc < HandleInner > ,
12+ #[ derive( Clone , Debug ) ]
13+ pub struct Handle < A : Address > {
14+ inner : Arc < HandleInner < A > > ,
1615}
1716
18- #[ derive( Debug , Default ) ]
19- struct HandleInner {
20- addr : Mutex < Option < SocketAddr > > ,
17+ impl < A : Address > Default for Handle < A > {
18+ fn default ( ) -> Self {
19+ Self {
20+ inner : Default :: default ( ) ,
21+ }
22+ }
23+ }
24+
25+ #[ derive( Debug ) ]
26+ struct HandleInner < A : Address > {
27+ addr : Mutex < Option < A > > ,
2128 addr_notify : Notify ,
2229 conn_count : AtomicUsize ,
2330 shutdown : NotifyOnce ,
@@ -26,7 +33,22 @@ struct HandleInner {
2633 conn_end : NotifyOnce ,
2734}
2835
29- impl Handle {
36+ // Manually implemented as the derive macro will want A to be Default.
37+ impl < A : Address > Default for HandleInner < A > {
38+ fn default ( ) -> Self {
39+ Self {
40+ addr : Default :: default ( ) ,
41+ addr_notify : Default :: default ( ) ,
42+ conn_count : Default :: default ( ) ,
43+ shutdown : Default :: default ( ) ,
44+ graceful : Default :: default ( ) ,
45+ graceful_dur : Default :: default ( ) ,
46+ conn_end : Default :: default ( ) ,
47+ }
48+ }
49+ }
50+
51+ impl < A : Address > Handle < A > {
3052 /// Create a new handle.
3153 pub fn new ( ) -> Self {
3254 Self :: default ( )
@@ -54,25 +76,25 @@ impl Handle {
5476 /// Returns local address and port when server starts listening.
5577 ///
5678 /// Returns `None` if server fails to bind.
57- pub async fn listening ( & self ) -> Option < SocketAddr > {
79+ pub async fn listening ( & self ) -> Option < A > {
5880 let notified = self . inner . addr_notify . notified ( ) ;
5981
60- if let Some ( addr) = * self . inner . addr . lock ( ) . unwrap ( ) {
82+ if let Some ( addr) = self . inner . addr . lock ( ) . unwrap ( ) . clone ( ) {
6183 return Some ( addr) ;
6284 }
6385
6486 notified. await ;
6587
66- * self . inner . addr . lock ( ) . unwrap ( )
88+ self . inner . addr . lock ( ) . unwrap ( ) . clone ( )
6789 }
6890
69- pub ( crate ) fn notify_listening ( & self , addr : Option < SocketAddr > ) {
91+ pub ( crate ) fn notify_listening ( & self , addr : Option < A > ) {
7092 * self . inner . addr . lock ( ) . unwrap ( ) = addr;
7193
7294 self . inner . addr_notify . notify_waiters ( ) ;
7395 }
7496
75- pub ( crate ) fn watcher ( & self ) -> Watcher {
97+ pub ( crate ) fn watcher ( & self ) -> Watcher < A > {
7698 Watcher :: new ( self . clone ( ) )
7799 }
78100
@@ -102,12 +124,12 @@ impl Handle {
102124 }
103125}
104126
105- pub ( crate ) struct Watcher {
106- handle : Handle ,
127+ pub ( crate ) struct Watcher < A : Address > {
128+ handle : Handle < A > ,
107129}
108130
109- impl Watcher {
110- fn new ( handle : Handle ) -> Self {
131+ impl < A : Address > Watcher < A > {
132+ fn new ( handle : Handle < A > ) -> Self {
111133 handle. inner . conn_count . fetch_add ( 1 , Ordering :: SeqCst ) ;
112134
113135 Self { handle }
@@ -122,7 +144,7 @@ impl Watcher {
122144 }
123145}
124146
125- impl Drop for Watcher {
147+ impl < A : Address > Drop for Watcher < A > {
126148 fn drop ( & mut self ) {
127149 let count = self . handle . inner . conn_count . fetch_sub ( 1 , Ordering :: SeqCst ) - 1 ;
128150
0 commit comments