summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBert Belder <bertbelder@gmail.com>2021-09-10 15:47:09 -0700
committerGitHub <noreply@github.com>2021-09-10 15:47:09 -0700
commitfa963909e5c48cacd60cc02db200927611fa8e91 (patch)
tree049887e4cbdc3cd9538077fa23d461814b671041
parent87052927afd505ff1c5d42075cd23a3619b29011 (diff)
perf(ext/http): optimize auto cleanup of request resource (#11978)
Fixes #11963.
-rw-r--r--core/01_core.js5
-rw-r--r--core/ops_builtin.rs17
-rw-r--r--ext/http/01_http.js11
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);
}
};
}