Skip to content

Commit 0a27025

Browse files
authored
Make windows http server multithreaded (#670)
1 parent 96647b3 commit 0a27025

File tree

1 file changed

+4
-27
lines changed

1 file changed

+4
-27
lines changed

http/src/lib.rs

Lines changed: 4 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -343,16 +343,6 @@ where
343343
self
344344
}
345345

346-
/// Sets number of threads of the server to run.
347-
///
348-
/// Panics when set to `0`.
349-
#[cfg(not(unix))]
350-
#[allow(unused_mut)]
351-
pub fn threads(mut self, _threads: usize) -> Self {
352-
warn!("Multi-threaded server is not available on Windows. Falling back to single thread.");
353-
self
354-
}
355-
356346
/// Sets number of threads of the server to run.
357347
///
358348
/// Panics when set to `0`.
@@ -362,7 +352,6 @@ where
362352
/// So it's also possible to run a multi-threaded server by
363353
/// passing the default `tokio::runtime` executor to this builder
364354
/// and setting `threads` to 1.
365-
#[cfg(unix)]
366355
pub fn threads(mut self, threads: usize) -> Self {
367356
self.threads = threads;
368357
self
@@ -558,25 +547,20 @@ fn serve<M: jsonrpc::Metadata, S: jsonrpc::Middleware<M>>(
558547
// non-blocking mode of operation (future Tokio/Hyper versions
559548
// require for the callers to do that manually)
560549
listener.set_nonblocking(true)?;
561-
// HACK: See below.
562-
#[cfg(windows)]
563-
let raw_socket = std::os::windows::io::AsRawSocket::as_raw_socket(&listener);
564-
#[cfg(not(windows))]
565-
let raw_socket = ();
566550

567551
let server_builder =
568552
hyper::Server::from_tcp(listener).map_err(|e| io::Error::new(io::ErrorKind::Other, e))?;
569553
// Add current host to allowed headers.
570554
// NOTE: we need to use `l.local_addr()` instead of `addr`
571555
// it might be different!
572-
Ok((server_builder, local_addr, raw_socket))
556+
Ok((server_builder, local_addr))
573557
};
574558

575559
let bind_result = match bind() {
576-
Ok((server_builder, local_addr, raw_socket)) => {
560+
Ok((server_builder, local_addr)) => {
577561
// Send local address
578562
match local_addr_tx.send(Ok(local_addr)) {
579-
Ok(_) => Ok((server_builder, local_addr, raw_socket)),
563+
Ok(_) => Ok((server_builder, local_addr)),
580564
Err(_) => {
581565
warn!(
582566
"Thread {:?} unable to reach receiver, closing server",
@@ -594,7 +578,7 @@ fn serve<M: jsonrpc::Metadata, S: jsonrpc::Middleware<M>>(
594578
}
595579
};
596580

597-
let (server_builder, local_addr, _raw_socket) = bind_result?;
581+
let (server_builder, local_addr) = bind_result?;
598582

599583
let allowed_hosts = server_utils::hosts::update(allowed_hosts, &local_addr);
600584

@@ -631,13 +615,6 @@ fn serve<M: jsonrpc::Metadata, S: jsonrpc::Middleware<M>>(
631615
error!("Error running HTTP server: {:?}", err);
632616
}
633617

634-
// FIXME: Work around TCP listener socket not being properly closed
635-
// in mio v0.6. This runs the std::net::TcpListener's destructor,
636-
// which closes the underlying OS socket.
637-
// Remove this once we migrate to Tokio 1.0.
638-
#[cfg(windows)]
639-
let _: std::net::TcpListener = unsafe { std::os::windows::io::FromRawSocket::from_raw_socket(_raw_socket) };
640-
641618
done_tx.send(())
642619
});
643620
}

0 commit comments

Comments
 (0)