diff options
author | Bert Belder <bertbelder@gmail.com> | 2021-09-10 15:47:09 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-09-10 15:47:09 -0700 |
commit | fa963909e5c48cacd60cc02db200927611fa8e91 (patch) | |
tree | 049887e4cbdc3cd9538077fa23d461814b671041 | |
parent | 87052927afd505ff1c5d42075cd23a3619b29011 (diff) |
perf(ext/http): optimize auto cleanup of request resource (#11978)
Fixes #11963.
-rw-r--r-- | core/01_core.js | 5 | ||||
-rw-r--r-- | core/ops_builtin.rs | 17 | ||||
-rw-r--r-- | ext/http/01_http.js | 11 |
3 files changed, 26 insertions, 7 deletions
diff --git a/core/01_core.js b/core/01_core.js index b1497c934..296d9bbcf 100644 --- a/core/01_core.js +++ b/core/01_core.js @@ -148,6 +148,10 @@ opSync("op_close", rid); } + function tryClose(rid) { + opSync("op_try_close", rid); + } + function print(str, isErr = false) { opSync("op_print", str, isErr); } @@ -175,6 +179,7 @@ opSync, ops, close, + tryClose, print, resources, registerErrorBuilder, diff --git a/core/ops_builtin.rs b/core/ops_builtin.rs index 459b2a967..06de59054 100644 --- a/core/ops_builtin.rs +++ b/core/ops_builtin.rs @@ -17,6 +17,7 @@ pub(crate) fn init_builtins() -> Extension { )) .ops(vec![ ("op_close", op_sync(op_close)), + ("op_try_close", op_sync(op_try_close)), ("op_print", op_sync(op_print)), ("op_resources", op_sync(op_resources)), ]) @@ -44,10 +45,24 @@ pub fn op_close( rid: Option<ResourceId>, _: (), ) -> Result<(), AnyError> { - // TODO(@AaronO): drop Option after improving type-strictness balance in serde_v8 + // TODO(@AaronO): drop Option after improving type-strictness balance in + // serde_v8 let rid = rid.ok_or_else(|| type_error("missing or invalid `rid`"))?; state.resource_table.close(rid)?; + Ok(()) +} +/// Try to remove a resource from the resource table. If there is no resource +/// with the specified `rid`, this is a no-op. +pub fn op_try_close( + state: &mut OpState, + rid: Option<ResourceId>, + _: (), +) -> Result<(), AnyError> { + // TODO(@AaronO): drop Option after improving type-strictness balance in + // serde_v8. + let rid = rid.ok_or_else(|| type_error("missing or invalid `rid`"))?; + let _ = state.resource_table.close(rid); Ok(()) } diff --git a/ext/http/01_http.js b/ext/http/01_http.js index 2e742d097..6e3bb5c80 100644 --- a/ext/http/01_http.js +++ b/ext/http/01_http.js @@ -297,13 +297,12 @@ ws[_eventLoop](); } - } else { + } else if (typeof requestRid === "number") { // Try to close "request" resource. It might have been already consumed, - // but if it hasn't been we need to close it here to avoid resource leak. - try { - SetPrototypeDelete(httpConn.managedResources, requestRid); - core.close(requestRid); - } catch { /* pass */ } + // but if it hasn't been we need to close it here to avoid resource + // leak. + SetPrototypeDelete(httpConn.managedResources, requestRid); + core.tryClose(requestRid); } }; } |