Skip to content

Commit 26a5af7

Browse files
authored
reduce branch in Accept::accept method (#300)
1 parent 0ee8d03 commit 26a5af7

File tree

2 files changed

+45
-48
lines changed

2 files changed

+45
-48
lines changed

actix-server/src/accept.rs

Lines changed: 42 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -208,17 +208,7 @@ impl Accept {
208208
}
209209
Some(WakerInterest::Pause) => {
210210
drop(guard);
211-
sockets.iter_mut().for_each(|(_, info)| {
212-
match self.deregister(info) {
213-
Ok(_) => info!(
214-
"Paused accepting connections on {}",
215-
info.addr
216-
),
217-
Err(e) => {
218-
error!("Can not deregister server socket {}", e)
219-
}
220-
}
221-
});
211+
self.deregister_all(&mut sockets);
222212
}
223213
Some(WakerInterest::Resume) => {
224214
drop(guard);
@@ -295,10 +285,18 @@ impl Accept {
295285
self.poll.registry().deregister(&mut info.lst)
296286
}
297287

288+
fn deregister_logged(&self, info: &mut ServerSocketInfo) {
289+
match self.deregister(info) {
290+
Ok(_) => info!("Paused accepting connections on {}", info.addr),
291+
Err(e) => {
292+
error!("Can not deregister server socket {}", e)
293+
}
294+
}
295+
}
296+
298297
fn deregister_all(&self, sockets: &mut Slab<ServerSocketInfo>) {
299298
sockets.iter_mut().for_each(|(_, info)| {
300-
info!("Accepting connections on {} has been paused", info.addr);
301-
let _ = self.deregister(info);
299+
self.deregister_logged(info);
302300
});
303301
}
304302

@@ -388,43 +386,42 @@ impl Accept {
388386

389387
fn accept(&mut self, sockets: &mut Slab<ServerSocketInfo>, token: usize) {
390388
loop {
391-
let msg = if let Some(info) = sockets.get_mut(token) {
392-
match info.lst.accept() {
393-
Ok(Some((io, addr))) => Conn {
389+
let info = sockets
390+
.get_mut(token)
391+
.expect("ServerSocketInfo is removed from Slab");
392+
393+
match info.lst.accept() {
394+
Ok((io, addr)) => {
395+
let msg = Conn {
394396
io,
395397
token: info.token,
396398
peer: Some(addr),
397-
},
398-
Ok(None) => return,
399-
Err(ref e) if e.kind() == io::ErrorKind::WouldBlock => return,
400-
Err(ref e) if connection_error(e) => continue,
401-
Err(e) => {
402-
// deregister listener temporary
403-
error!("Error accepting connection: {}", e);
404-
if let Err(err) = self.deregister(info) {
405-
error!("Can not deregister server socket {}", err);
406-
}
407-
408-
// sleep after error. write the timeout to socket info as later
409-
// the poll would need it mark which socket and when it's
410-
// listener should be registered
411-
info.timeout = Some(Instant::now() + Duration::from_millis(500));
412-
413-
// after the sleep a Timer interest is sent to Accept Poll
414-
let waker = self.waker.clone();
415-
System::current().arbiter().spawn(async move {
416-
sleep(Duration::from_millis(510)).await;
417-
waker.wake(WakerInterest::Timer);
418-
});
419-
420-
return;
421-
}
399+
};
400+
self.accept_one(sockets, msg);
401+
}
402+
Err(ref e) if e.kind() == io::ErrorKind::WouldBlock => return,
403+
Err(ref e) if connection_error(e) => continue,
404+
Err(e) => {
405+
error!("Error accepting connection: {}", e);
406+
407+
// deregister listener temporary
408+
self.deregister_logged(info);
409+
410+
// sleep after error. write the timeout to socket info as later
411+
// the poll would need it mark which socket and when it's
412+
// listener should be registered
413+
info.timeout = Some(Instant::now() + Duration::from_millis(500));
414+
415+
// after the sleep a Timer interest is sent to Accept Poll
416+
let waker = self.waker.clone();
417+
System::current().arbiter().spawn(async move {
418+
sleep(Duration::from_millis(510)).await;
419+
waker.wake(WakerInterest::Timer);
420+
});
421+
422+
return;
422423
}
423-
} else {
424-
return;
425424
};
426-
427-
self.accept_one(sockets, msg);
428425
}
429426
}
430427
}

actix-server/src/socket.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -40,15 +40,15 @@ impl MioListener {
4040
}
4141
}
4242

43-
pub(crate) fn accept(&self) -> io::Result<Option<(MioStream, SocketAddr)>> {
43+
pub(crate) fn accept(&self) -> io::Result<(MioStream, SocketAddr)> {
4444
match *self {
4545
MioListener::Tcp(ref lst) => lst
4646
.accept()
47-
.map(|(stream, addr)| Some((MioStream::Tcp(stream), SocketAddr::Tcp(addr)))),
47+
.map(|(stream, addr)| (MioStream::Tcp(stream), SocketAddr::Tcp(addr))),
4848
#[cfg(unix)]
4949
MioListener::Uds(ref lst) => lst
5050
.accept()
51-
.map(|(stream, addr)| Some((MioStream::Uds(stream), SocketAddr::Uds(addr)))),
51+
.map(|(stream, addr)| (MioStream::Uds(stream), SocketAddr::Uds(addr))),
5252
}
5353
}
5454
}

0 commit comments

Comments
 (0)