diff options
author | Bert Belder <bertbelder@gmail.com> | 2019-04-28 21:31:10 +0200 |
---|---|---|
committer | Bert Belder <bertbelder@gmail.com> | 2019-05-01 21:11:09 +0200 |
commit | 41c7e96f1a81ea416ebb3ba45f2815e0202d6b75 (patch) | |
tree | 5fcb15b8664d7579cf4db76d16754c8efa7c4667 /cli/state.rs | |
parent | abdb98a2516a9d6ec313805dffbc2107d38f8ed4 (diff) |
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<ArrayBuffer> 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.
Diffstat (limited to 'cli/state.rs')
-rw-r--r-- | cli/state.rs | 4 |
1 files changed, 2 insertions, 2 deletions
diff --git a/cli/state.rs b/cli/state.rs index 5aefe7d90..2bfc641d5 100644 --- a/cli/state.rs +++ b/cli/state.rs @@ -8,9 +8,9 @@ use crate::permissions::DenoPermissions; use crate::resources; use crate::resources::ResourceId; use crate::worker::Worker; -use deno::deno_buf; use deno::Buf; use deno::Op; +use deno::PinnedBuf; use futures::future::Shared; use std; use std::collections::HashMap; @@ -84,7 +84,7 @@ impl ThreadSafeState { pub fn dispatch( &self, control: &[u8], - zero_copy: deno_buf, + zero_copy: Option<PinnedBuf>, ) -> (bool, Box<Op>) { ops::dispatch_all(self, control, zero_copy, self.dispatch_selector) } |