summaryrefslogtreecommitdiff
path: root/cli/ops/net.rs
diff options
context:
space:
mode:
authorJoão Souto <joao.jpgs@hotmail.com>2020-03-11 22:19:24 +0000
committerGitHub <noreply@github.com>2020-03-11 18:19:24 -0400
commitfb5c31416d4b9e526ca0fcc134dc8f366e367012 (patch)
treecffd644e8f6b99db10a75ecb6e32879d9f4c3ce0 /cli/ops/net.rs
parent810e4a16bedbc77ef0651f4f24626d98ca566083 (diff)
Add waker to StreamResource to fix hang on close bugs (#4293)
Diffstat (limited to 'cli/ops/net.rs')
-rw-r--r--cli/ops/net.rs26
1 files changed, 16 insertions, 10 deletions
diff --git a/cli/ops/net.rs b/cli/ops/net.rs
index d8dd9b3c9..3987e94c1 100644
--- a/cli/ops/net.rs
+++ b/cli/ops/net.rs
@@ -1,6 +1,6 @@
// Copyright 2018-2020 the Deno authors. All rights reserved. MIT license.
use super::dispatch_json::{Deserialize, JsonOp, Value};
-use super::io::StreamResource;
+use super::io::{StreamResource, StreamResourceHolder};
use crate::op_error::OpError;
use crate::resolve_addr::resolve_addr;
use crate::state::State;
@@ -78,9 +78,12 @@ fn op_accept(
let local_addr = tcp_stream.local_addr()?;
let remote_addr = tcp_stream.peer_addr()?;
let mut state = state_.borrow_mut();
- let rid = state
- .resource_table
- .add("tcpStream", Box::new(StreamResource::TcpStream(tcp_stream)));
+ let rid = state.resource_table.add(
+ "tcpStream",
+ Box::new(StreamResourceHolder::new(StreamResource::TcpStream(
+ tcp_stream,
+ ))),
+ );
Ok(json!({
"rid": rid,
"localAddr": {
@@ -207,9 +210,12 @@ fn op_connect(
let local_addr = tcp_stream.local_addr()?;
let remote_addr = tcp_stream.peer_addr()?;
let mut state = state_.borrow_mut();
- let rid = state
- .resource_table
- .add("tcpStream", Box::new(StreamResource::TcpStream(tcp_stream)));
+ let rid = state.resource_table.add(
+ "tcpStream",
+ Box::new(StreamResourceHolder::new(StreamResource::TcpStream(
+ tcp_stream,
+ ))),
+ );
Ok(json!({
"rid": rid,
"localAddr": {
@@ -251,11 +257,11 @@ fn op_shutdown(
};
let mut state = state.borrow_mut();
- let resource = state
+ let resource_holder = state
.resource_table
- .get_mut::<StreamResource>(rid)
+ .get_mut::<StreamResourceHolder>(rid)
.ok_or_else(OpError::bad_resource_id)?;
- match resource {
+ match resource_holder.resource {
StreamResource::TcpStream(ref mut stream) => {
TcpStream::shutdown(stream, shutdown_mode).map_err(OpError::from)?;
}