Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/nodejs/node.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAnna Henningsen <anna@addaleax.net>2019-02-19 00:58:27 +0300
committerAnna Henningsen <anna@addaleax.net>2019-02-25 04:01:11 +0300
commit84e02b178ad14fae0df2a514e8a39bfa50ffdc2d (patch)
treeddc0435b6bd0b7811e0bf47687777c56b2857fd0 /src/stream_pipe.cc
parent6c257cdf271384555d0ced77104a1d6b0480e246 (diff)
src: allocate Buffer memory using ArrayBuffer allocator
Always use the right allocator for memory that is turned into an `ArrayBuffer` at a later point. This enables embedders to use their own `ArrayBuffer::Allocator`s, and is inspired by Electron’s electron/node@f61bae3440e. It should render their downstream patch unnecessary. Refs: https://github.com/electron/node/commit/f61bae3440e1bfcc83bba6ff0785adfb89b4045e PR-URL: https://github.com/nodejs/node/pull/26207 Reviewed-By: James M Snell <jasnell@gmail.com> Reviewed-By: Joyee Cheung <joyeec9h3@gmail.com>
Diffstat (limited to 'src/stream_pipe.cc')
-rw-r--r--src/stream_pipe.cc15
1 files changed, 7 insertions, 8 deletions
diff --git a/src/stream_pipe.cc b/src/stream_pipe.cc
index 19d732d6592..4c9b447a61c 100644
--- a/src/stream_pipe.cc
+++ b/src/stream_pipe.cc
@@ -114,17 +114,17 @@ uv_buf_t StreamPipe::ReadableListener::OnStreamAlloc(size_t suggested_size) {
StreamPipe* pipe = ContainerOf(&StreamPipe::readable_listener_, this);
size_t size = std::min(suggested_size, pipe->wanted_data_);
CHECK_GT(size, 0);
- return uv_buf_init(Malloc(size), size);
+ return pipe->env()->AllocateManaged(size).release();
}
void StreamPipe::ReadableListener::OnStreamRead(ssize_t nread,
- const uv_buf_t& buf) {
+ const uv_buf_t& buf_) {
StreamPipe* pipe = ContainerOf(&StreamPipe::readable_listener_, this);
+ AllocatedBuffer buf(pipe->env(), buf_);
AsyncScope async_scope(pipe);
if (nread < 0) {
// EOF or error; stop reading and pass the error to the previous listener
// (which might end up in JS).
- free(buf.base);
pipe->is_eof_ = true;
stream()->ReadStop();
CHECK_NOT_NULL(previous_listener_);
@@ -138,19 +138,18 @@ void StreamPipe::ReadableListener::OnStreamRead(ssize_t nread,
return;
}
- pipe->ProcessData(nread, buf);
+ pipe->ProcessData(nread, std::move(buf));
}
-void StreamPipe::ProcessData(size_t nread, const uv_buf_t& buf) {
- uv_buf_t buffer = uv_buf_init(buf.base, nread);
+void StreamPipe::ProcessData(size_t nread, AllocatedBuffer&& buf) {
+ uv_buf_t buffer = uv_buf_init(buf.data(), nread);
StreamWriteResult res = sink()->Write(&buffer, 1);
if (!res.async) {
- free(buf.base);
writable_listener_.OnStreamAfterWrite(nullptr, res.err);
} else {
is_writing_ = true;
is_reading_ = false;
- res.wrap->SetAllocatedStorage(buf.base, buf.len);
+ res.wrap->SetAllocatedStorage(std::move(buf));
if (source() != nullptr)
source()->ReadStop();
}