@@ -77,6 +77,8 @@ using v8::Undefined;
7777using v8::Value;
7878using worker::Worker;
7979
80+ constexpr size_t kManagedBufferCacheSize = 64 * 1024 ;
81+
8082int const ContextEmbedderTag::kNodeContextTag = 0x6e6f64 ;
8183void * const ContextEmbedderTag::kNodeContextTagPtr = const_cast <void *>(
8284 static_cast <const void *>(&ContextEmbedderTag::kNodeContextTag ));
@@ -746,10 +748,16 @@ void Environment::add_refs(int64_t diff) {
746748}
747749
748750uv_buf_t Environment::allocate_managed_buffer (const size_t suggested_size) {
749- std::unique_ptr<BackingStore> bs = ArrayBuffer::NewBackingStore (
750- isolate (),
751- suggested_size,
752- BackingStoreInitializationMode::kUninitialized );
751+ std::unique_ptr<BackingStore> bs;
752+ if (suggested_size == kManagedBufferCacheSize &&
753+ managed_buffer_cache_ != nullptr ) {
754+ bs = std::move (managed_buffer_cache_);
755+ } else {
756+ bs = ArrayBuffer::NewBackingStore (
757+ isolate (),
758+ suggested_size,
759+ BackingStoreInitializationMode::kUninitialized );
760+ }
753761 uv_buf_t buf = uv_buf_init (static_cast <char *>(bs->Data ()), bs->ByteLength ());
754762 released_allocated_buffers_.emplace (buf.base , std::move (bs));
755763 return buf;
@@ -767,6 +775,11 @@ std::unique_ptr<BackingStore> Environment::release_managed_buffer(
767775 return bs;
768776}
769777
778+ void Environment::recycle_managed_buffer (std::unique_ptr<BackingStore> bs) {
779+ if (bs != nullptr && bs->ByteLength () == kManagedBufferCacheSize )
780+ managed_buffer_cache_ = std::move (bs);
781+ }
782+
770783std::string Environment::GetExecPath (const std::vector<std::string>& argv) {
771784 char exec_path_buf[2 * PATH_MAX ];
772785 size_t exec_path_len = sizeof (exec_path_buf);
0 commit comments