From 41c7e96f1a81ea416ebb3ba45f2815e0202d6b75 Mon Sep 17 00:00:00 2001 From: Bert Belder Date: Sun, 28 Apr 2019 21:31:10 +0200 Subject: Refactor zero-copy buffers for performance and to prevent memory leaks * In order to prevent ArrayBuffers from getting garbage collected by V8, we used to store a v8::Persistent in a map. This patch introduces a custom ArrayBuffer allocator which doesn't use Persistent handles, but instead stores a pointer to the actual ArrayBuffer data alongside with a reference count. Since creating Persistent handles has quite a bit of overhead, this change significantly increases performance. Various HTTP server benchmarks report about 5-10% more requests per second than before. * Previously the Persistent handle that prevented garbage collection had to be released manually, and this wasn't always done, which was causing memory leaks. This has been resolved by introducing a new `PinnedBuf` type in both Rust and C++ that automatically re-enables garbage collection when it goes out of scope. * Zero-copy buffers are now correctly wrapped in an Option if there is a possibility that they're not present. This clears up a correctness issue where we were creating zero-length slices from a null pointer, which is against the rules. --- core/lib.rs | 1 + 1 file changed, 1 insertion(+) (limited to 'core/lib.rs') diff --git a/core/lib.rs b/core/lib.rs index 56cd69a68..9533bce32 100644 --- a/core/lib.rs +++ b/core/lib.rs @@ -16,6 +16,7 @@ pub use crate::isolate::*; pub use crate::js_errors::*; pub use crate::libdeno::deno_buf; pub use crate::libdeno::deno_mod; +pub use crate::libdeno::PinnedBuf; pub use crate::modules::*; pub fn v8_version() -> &'static str { -- cgit v1.2.3