From fb5c31416d4b9e526ca0fcc134dc8f366e367012 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Souto?= Date: Wed, 11 Mar 2020 22:19:24 +0000 Subject: Add waker to StreamResource to fix hang on close bugs (#4293) --- cli/ops/net.rs | 26 ++++++++++++++++---------- 1 file changed, 16 insertions(+), 10 deletions(-) (limited to 'cli/ops/net.rs') 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::(rid) + .get_mut::(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)?; } -- cgit v1.2.3