diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/eager_unix.rs | 85 | ||||
-rw-r--r-- | src/main.rs | 3 | ||||
-rw-r--r-- | src/ops.rs | 7 | ||||
-rw-r--r-- | src/resources.rs | 94 |
4 files changed, 4 insertions, 185 deletions
diff --git a/src/eager_unix.rs b/src/eager_unix.rs deleted file mode 100644 index 1699c421c..000000000 --- a/src/eager_unix.rs +++ /dev/null @@ -1,85 +0,0 @@ -// Copyright 2018-2019 the Deno authors. All rights reserved. MIT license. -use crate::resources::{EagerAccept, EagerRead, EagerWrite, Resource}; -use crate::tokio_util; -use crate::tokio_write; - -use futures::future::{self, Either}; -use std; -use std::io::{ErrorKind, Read, Write}; -use std::os::unix::io::{AsRawFd, FromRawFd, IntoRawFd}; -use tokio; -use tokio::net::{TcpListener, TcpStream}; -use tokio_io; - -pub fn tcp_read<T: AsMut<[u8]>>( - tcp_stream: &TcpStream, - resource: Resource, - mut buf: T, -) -> EagerRead<Resource, T> { - // Unfortunately we can't just call read() on tokio::net::TcpStream - let fd = (*tcp_stream).as_raw_fd(); - let mut std_tcp_stream = unsafe { std::net::TcpStream::from_raw_fd(fd) }; - let read_result = std_tcp_stream.read(buf.as_mut()); - // std_tcp_stream will close when it gets dropped. Thus... - let _ = std_tcp_stream.into_raw_fd(); - match read_result { - Ok(nread) => Either::B(future::ok((resource, buf, nread))), - Err(err) => { - if err.kind() == ErrorKind::WouldBlock { - Either::A(tokio_io::io::read(resource, buf)) - } else { - Either::B(future::err(err)) - } - } - } -} - -pub fn tcp_write<T: AsRef<[u8]>>( - tcp_stream: &TcpStream, - resource: Resource, - buf: T, -) -> EagerWrite<Resource, T> { - let fd = (*tcp_stream).as_raw_fd(); - let mut std_tcp_stream = unsafe { std::net::TcpStream::from_raw_fd(fd) }; - let write_result = std_tcp_stream.write(buf.as_ref()); - // std_tcp_stream will close when it gets dropped. Thus... - let _ = std_tcp_stream.into_raw_fd(); - match write_result { - Ok(nwrite) => Either::B(future::ok((resource, buf, nwrite))), - Err(err) => { - if err.kind() == ErrorKind::WouldBlock { - Either::A(tokio_write::write(resource, buf)) - } else { - Either::B(future::err(err)) - } - } - } -} - -pub fn tcp_accept( - tcp_listener: &TcpListener, - resource: Resource, -) -> EagerAccept { - let fd = (*tcp_listener).as_raw_fd(); - let std_listener = unsafe { std::net::TcpListener::from_raw_fd(fd) }; - let result = std_listener.accept(); - // std_listener will close when it gets dropped. Thus... - let _ = std_listener.into_raw_fd(); - match result { - Ok((std_stream, addr)) => { - let result = tokio::net::TcpStream::from_std( - std_stream, - &tokio::reactor::Handle::default(), - ); - let tokio_stream = result.unwrap(); - Either::B(future::ok((tokio_stream, addr))) - } - Err(err) => { - if err.kind() == ErrorKind::WouldBlock { - Either::A(tokio_util::accept(resource)) - } else { - Either::B(future::err(err)) - } - } - } -} diff --git a/src/main.rs b/src/main.rs index 9afbbb8a9..0f12eebd1 100644 --- a/src/main.rs +++ b/src/main.rs @@ -35,9 +35,6 @@ mod tokio_write; pub mod version; pub mod workers; -#[cfg(unix)] -mod eager_unix; - use crate::cli::Cli; use crate::errors::RustOrJsError; use crate::isolate::Isolate; diff --git a/src/ops.rs b/src/ops.rs index 33a7d7cdd..c6b9fe84a 100644 --- a/src/ops.rs +++ b/src/ops.rs @@ -18,6 +18,7 @@ use crate::resources; use crate::resources::table_entries; use crate::resources::Resource; use crate::tokio_util; +use crate::tokio_write; use crate::version; use deno_core::deno_buf; use deno_core::JSError; @@ -918,7 +919,7 @@ fn op_read( match resources::lookup(rid) { None => odd_future(errors::bad_resource()), Some(resource) => { - let op = resources::eager_read(resource, data) + let op = tokio::io::read(resource, data) .map_err(DenoError::from) .and_then(move |(_resource, _buf, nread)| { let builder = &mut FlatBufferBuilder::new(); @@ -956,7 +957,7 @@ fn op_write( match resources::lookup(rid) { None => odd_future(errors::bad_resource()), Some(resource) => { - let op = resources::eager_write(resource, data) + let op = tokio_write::write(resource, data) .map_err(DenoError::from) .and_then(move |(_resource, _buf, nwritten)| { let builder = &mut FlatBufferBuilder::new(); @@ -1551,7 +1552,7 @@ fn op_accept( match resources::lookup(server_rid) { None => odd_future(errors::bad_resource()), Some(server_resource) => { - let op = resources::eager_accept(server_resource) + let op = tokio_util::accept(server_resource) .map_err(DenoError::from) .and_then(move |(tcp_stream, _socket_addr)| { new_conn(cmd_id, tcp_stream) diff --git a/src/resources.rs b/src/resources.rs index e962bce8e..1540f4ff7 100644 --- a/src/resources.rs +++ b/src/resources.rs @@ -9,8 +9,6 @@ // handlers) look up resources by their integer id here. use crate::cli::Buf; -#[cfg(unix)] -use crate::eager_unix as eager; use crate::errors; use crate::errors::bad_resource; use crate::errors::DenoError; @@ -18,11 +16,8 @@ use crate::errors::DenoResult; use crate::http_body::HttpBody; use crate::isolate_state::WorkerChannels; use crate::repl::Repl; -use crate::tokio_util; -use crate::tokio_write; use futures; -use futures::future::{Either, FutureResult}; use futures::Future; use futures::Poll; use futures::Sink; @@ -39,7 +34,6 @@ use std::sync::{Arc, Mutex}; use tokio; use tokio::io::{AsyncRead, AsyncWrite}; use tokio::net::TcpStream; -use tokio_io; use tokio_process; pub type ResourceId = u32; // Sometimes referred to RID. @@ -440,94 +434,6 @@ pub fn lookup(rid: ResourceId) -> Option<Resource> { table.get(&rid).map(|_| Resource { rid }) } -pub type EagerRead<R, T> = - Either<tokio_io::io::Read<R, T>, FutureResult<(R, T, usize), std::io::Error>>; - -pub type EagerWrite<R, T> = - Either<tokio_write::Write<R, T>, FutureResult<(R, T, usize), std::io::Error>>; - -pub type EagerAccept = Either< - tokio_util::Accept, - FutureResult<(tokio::net::TcpStream, std::net::SocketAddr), std::io::Error>, ->; - -#[cfg(not(unix))] -#[allow(unused_mut)] -pub fn eager_read<T: AsMut<[u8]>>( - resource: Resource, - mut buf: T, -) -> EagerRead<Resource, T> { - Either::A(tokio_io::io::read(resource, buf)) -} - -#[cfg(not(unix))] -pub fn eager_write<T: AsRef<[u8]>>( - resource: Resource, - buf: T, -) -> EagerWrite<Resource, T> { - Either::A(tokio_write::write(resource, buf)) -} - -#[cfg(not(unix))] -pub fn eager_accept(resource: Resource) -> EagerAccept { - Either::A(tokio_util::accept(resource)) -} - -// This is an optimization that Tokio should do. -// Attempt to call read() on the main thread. -#[cfg(unix)] -pub fn eager_read<T: AsMut<[u8]>>( - resource: Resource, - buf: T, -) -> EagerRead<Resource, T> { - let mut table = RESOURCE_TABLE.lock().unwrap(); - let maybe_repr = table.get_mut(&resource.rid); - match maybe_repr { - None => panic!("bad rid"), - Some(repr) => match repr { - Repr::TcpStream(ref mut tcp_stream) => { - eager::tcp_read(tcp_stream, resource, buf) - } - _ => Either::A(tokio_io::io::read(resource, buf)), - }, - } -} - -// This is an optimization that Tokio should do. -// Attempt to call write() on the main thread. -#[cfg(unix)] -pub fn eager_write<T: AsRef<[u8]>>( - resource: Resource, - buf: T, -) -> EagerWrite<Resource, T> { - let mut table = RESOURCE_TABLE.lock().unwrap(); - let maybe_repr = table.get_mut(&resource.rid); - match maybe_repr { - None => panic!("bad rid"), - Some(repr) => match repr { - Repr::TcpStream(ref mut tcp_stream) => { - eager::tcp_write(tcp_stream, resource, buf) - } - _ => Either::A(tokio_write::write(resource, buf)), - }, - } -} - -#[cfg(unix)] -pub fn eager_accept(resource: Resource) -> EagerAccept { - let mut table = RESOURCE_TABLE.lock().unwrap(); - let maybe_repr = table.get_mut(&resource.rid); - match maybe_repr { - None => panic!("bad rid"), - Some(repr) => match repr { - Repr::TcpListener(ref mut tcp_listener, _) => { - eager::tcp_accept(tcp_listener, resource) - } - _ => Either::A(tokio_util::accept(resource)), - }, - } -} - // TODO(kevinkassimo): revamp this after the following lands: // https://github.com/tokio-rs/tokio/pull/785 pub fn seek( |