@@ -43,8 +43,11 @@ pub struct Blocking;
43
43
/// Marker type specifying that the IPC socket should make nonblocking calls to the underlying socket
44
44
pub struct Nonblocking ;
45
45
46
- pub trait BackendBuilder < T > where T : Ipc + std:: marker:: Sync {
47
- type Back : Backend < T > ;
46
+ pub trait BackendBuilder < T >
47
+ where
48
+ T : Ipc + std:: marker:: Sync ,
49
+ {
50
+ type Back : Backend < T > ;
48
51
fn build ( self , atomic_bool : Arc < atomic:: AtomicBool > ) -> Self :: Back ;
49
52
}
50
53
/// Backend builder contains the objects
@@ -53,12 +56,12 @@ pub struct SingleBackendBuilder<T: Ipc> {
53
56
pub sock : T ,
54
57
}
55
58
56
- impl < T > BackendBuilder < T > for SingleBackendBuilder < T > where T : Ipc + std:: marker:: Sync {
59
+ impl < T > BackendBuilder < T > for SingleBackendBuilder < T >
60
+ where
61
+ T : Ipc + std:: marker:: Sync ,
62
+ {
57
63
type Back = SingleBackend < T > ;
58
- fn build (
59
- self ,
60
- atomic_bool : Arc < atomic:: AtomicBool > ,
61
- ) -> Self :: Back {
64
+ fn build ( self , atomic_bool : Arc < atomic:: AtomicBool > ) -> Self :: Back {
62
65
SingleBackend :: new ( self . sock , atomic_bool)
63
66
}
64
67
}
@@ -81,21 +84,31 @@ impl<T: Ipc> Clone for BackendSender<T> {
81
84
}
82
85
}
83
86
84
- pub struct MultiBackendBuilder < T : Ipc > {
87
+ pub struct BackendBroadcaster < T : Ipc > ( Vec < BackendSender < T > > ) ;
88
+
89
+ impl < T : Ipc > BackendBroadcaster < T > {
90
+ pub fn broadcast_msg ( & self , msg : & [ u8 ] ) -> Result < ( ) > {
91
+ for s in & self . 0 {
92
+ s. send_msg ( msg) ?;
93
+ }
94
+ Ok ( ( ) )
95
+ }
96
+ }
85
97
98
+ pub struct MultiBackendBuilder < T : Ipc > {
86
99
pub socks : Vec < T > ,
87
100
}
88
- impl < T > BackendBuilder < T > for MultiBackendBuilder < T > where T : Ipc + std:: marker:: Sync {
101
+ impl < T > BackendBuilder < T > for MultiBackendBuilder < T >
102
+ where
103
+ T : Ipc + std:: marker:: Sync ,
104
+ {
89
105
type Back = MultiBackend < T > ;
90
- fn build (
91
- self ,
92
- atomic_bool : Arc < atomic:: AtomicBool > ,
93
- ) -> Self :: Back {
106
+ fn build ( self , atomic_bool : Arc < atomic:: AtomicBool > ) -> Self :: Back {
94
107
MultiBackend :: new ( self . socks , atomic_bool)
95
108
}
96
109
}
97
110
98
- use crossbeam:: channel:: { Receiver , Select , unbounded } ;
111
+ use crossbeam:: channel:: { unbounded , Receiver , Select } ;
99
112
pub struct MultiBackend < T : Ipc > {
100
113
last_recvd : Option < usize > ,
101
114
continue_listening : Arc < atomic:: AtomicBool > ,
@@ -105,20 +118,19 @@ pub struct MultiBackend<T: Ipc> {
105
118
receivers_ptr : * mut [ Receiver < Option < Msg > > ] ,
106
119
}
107
120
108
- impl < T > MultiBackend < T > where T : Ipc + std:: marker:: Sync {
109
- pub fn new (
110
- socks : Vec < T > ,
111
- continue_listening : Arc < atomic:: AtomicBool > ,
112
- ) -> Self {
113
-
121
+ impl < T > MultiBackend < T >
122
+ where
123
+ T : Ipc + std:: marker:: Sync ,
124
+ {
125
+ pub fn new ( socks : Vec < T > , continue_listening : Arc < atomic:: AtomicBool > ) -> Self {
114
126
let mut backends = Vec :: new ( ) ;
115
127
let mut receivers = Vec :: new ( ) ;
116
128
117
129
for sock in socks {
118
130
let mut backend = SingleBackend :: new ( sock, Arc :: clone ( & continue_listening) ) ;
119
131
backends. push ( backend. sender ( ) ) ;
120
132
121
- let ( s, r) = unbounded ( ) ;
133
+ let ( s, r) = unbounded ( ) ;
122
134
receivers. push ( r) ;
123
135
124
136
std:: thread:: spawn ( move || loop {
@@ -135,8 +147,8 @@ impl<T> MultiBackend<T> where T: Ipc + std::marker::Sync {
135
147
136
148
let mut sel = Select :: new ( ) ;
137
149
let recv_ptr = Box :: into_raw ( Vec :: into_boxed_slice ( receivers) ) ;
138
- let recv_slice : & ' static [ Receiver < Option < Msg > > ] = unsafe { & * recv_ptr } ;
139
- for r in recv_slice {
150
+ let recv_slice: & ' static [ Receiver < Option < Msg > > ] = unsafe { & * recv_ptr } ;
151
+ for r in recv_slice {
140
152
sel. recv ( r) ;
141
153
}
142
154
@@ -145,7 +157,7 @@ impl<T> MultiBackend<T> where T: Ipc + std::marker::Sync {
145
157
continue_listening,
146
158
sel,
147
159
backends,
148
- receivers : recv_slice,
160
+ receivers : recv_slice,
149
161
receivers_ptr : recv_ptr,
150
162
}
151
163
}
@@ -184,7 +196,6 @@ impl<T: Ipc> Backend<T> for MultiBackend<T> {
184
196
}
185
197
}
186
198
187
-
188
199
/// Backend will yield incoming IPC messages forever via `next()`.
189
200
/// It owns the socket; `BackendSender` holds weak references.
190
201
/// The atomic bool is a way to stop iterating.
@@ -227,14 +238,10 @@ impl<T: Ipc> Backend<T> for SingleBackend<T> {
227
238
Some ( msg)
228
239
}
229
240
}
230
-
231
241
}
232
242
233
243
impl < T : Ipc > SingleBackend < T > {
234
- pub fn new (
235
- sock : T ,
236
- continue_listening : Arc < atomic:: AtomicBool > ,
237
- ) -> Self {
244
+ pub fn new ( sock : T , continue_listening : Arc < atomic:: AtomicBool > ) -> Self {
238
245
SingleBackend {
239
246
sock : Arc :: new ( sock) ,
240
247
continue_listening,
0 commit comments