diff options
author | Anna Henningsen <anna.henningsen@mongodb.com> | 2023-02-20 23:01:45 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-02-20 22:01:45 +0000 |
commit | b85b5ba10cd782a31e5b1bb26e496b19309e2084 (patch) | |
tree | 7740c2e6d2ddd324a889960584e4e356156a0404 /src/node_report_utils.cc | |
parent | ff92b40ffcb5f61579f08f95a3586953983bf206 (diff) | |
download | node-new-b85b5ba10cd782a31e5b1bb26e496b19309e2084.tar.gz |
src: use string_view for report and related code
Use `std::string_view` for process.report code and related
code, drop a few unnecessary `std::to_string` calls,
and use `MaybeStackBuffer` instead of `MallocedBuffer`,
all in order to avoid unnecessary heap allocations.
PR-URL: https://github.com/nodejs/node/pull/46723
Reviewed-By: Tobias Nießen <tniessen@tnie.de>
Reviewed-By: Yagiz Nizipli <yagiz@nizipli.com>
Reviewed-By: James M Snell <jasnell@gmail.com>
Reviewed-By: Darshan Sen <raisinten@gmail.com>
Reviewed-By: Chengzhong Wu <legendecas@gmail.com>
Diffstat (limited to 'src/node_report_utils.cc')
-rw-r--r-- | src/node_report_utils.cc | 62 |
1 files changed, 29 insertions, 33 deletions
diff --git a/src/node_report_utils.cc b/src/node_report_utils.cc index b8f32beb20..516eac22dc 100644 --- a/src/node_report_utils.cc +++ b/src/node_report_utils.cc @@ -83,36 +83,33 @@ static void ReportEndpoints(uv_handle_t* h, JSONWriter* writer) { // Utility function to format libuv pipe information. static void ReportPipeEndpoints(uv_handle_t* h, JSONWriter* writer) { uv_any_handle* handle = reinterpret_cast<uv_any_handle*>(h); - MallocedBuffer<char> buffer(0); - size_t buffer_size = 0; + MaybeStackBuffer<char> buffer; + size_t buffer_size = buffer.capacity(); int rc = -1; // First call to get required buffer size. - rc = uv_pipe_getsockname(&handle->pipe, buffer.data, &buffer_size); + rc = uv_pipe_getsockname(&handle->pipe, buffer.out(), &buffer_size); if (rc == UV_ENOBUFS) { - buffer = MallocedBuffer<char>(buffer_size); - if (buffer.data != nullptr) { - rc = uv_pipe_getsockname(&handle->pipe, buffer.data, &buffer_size); - } else { - buffer_size = 0; - } + buffer.AllocateSufficientStorage(buffer_size); + rc = uv_pipe_getsockname(&handle->pipe, buffer.out(), &buffer_size); } - if (rc == 0 && buffer_size != 0 && buffer.data != nullptr) { - writer->json_keyvalue("localEndpoint", buffer.data); + if (rc == 0 && buffer_size != 0) { + buffer.SetLength(buffer_size); + writer->json_keyvalue("localEndpoint", buffer.ToStringView()); } else { writer->json_keyvalue("localEndpoint", null); } // First call to get required buffer size. - rc = uv_pipe_getpeername(&handle->pipe, buffer.data, &buffer_size); + buffer_size = buffer.capacity(); + rc = uv_pipe_getpeername(&handle->pipe, buffer.out(), &buffer_size); if (rc == UV_ENOBUFS) { - buffer = MallocedBuffer<char>(buffer_size); - if (buffer.data != nullptr) { - rc = uv_pipe_getpeername(&handle->pipe, buffer.data, &buffer_size); - } + buffer.AllocateSufficientStorage(buffer_size); + rc = uv_pipe_getpeername(&handle->pipe, buffer.out(), &buffer_size); } - if (rc == 0 && buffer_size != 0 && buffer.data != nullptr) { - writer->json_keyvalue("remoteEndpoint", buffer.data); + if (rc == 0 && buffer_size != 0) { + buffer.SetLength(buffer_size); + writer->json_keyvalue("remoteEndpoint", buffer.ToStringView()); } else { writer->json_keyvalue("remoteEndpoint", null); } @@ -120,42 +117,41 @@ static void ReportPipeEndpoints(uv_handle_t* h, JSONWriter* writer) { // Utility function to format libuv path information. static void ReportPath(uv_handle_t* h, JSONWriter* writer) { - MallocedBuffer<char> buffer(0); + MaybeStackBuffer<char> buffer; int rc = -1; - size_t size = 0; + size_t size = buffer.capacity(); uv_any_handle* handle = reinterpret_cast<uv_any_handle*>(h); - bool wrote_filename = false; // First call to get required buffer size. switch (h->type) { case UV_FS_EVENT: - rc = uv_fs_event_getpath(&(handle->fs_event), buffer.data, &size); + rc = uv_fs_event_getpath(&(handle->fs_event), buffer.out(), &size); break; case UV_FS_POLL: - rc = uv_fs_poll_getpath(&(handle->fs_poll), buffer.data, &size); + rc = uv_fs_poll_getpath(&(handle->fs_poll), buffer.out(), &size); break; default: break; } if (rc == UV_ENOBUFS) { - buffer = MallocedBuffer<char>(size + 1); + buffer.AllocateSufficientStorage(size); switch (h->type) { case UV_FS_EVENT: - rc = uv_fs_event_getpath(&(handle->fs_event), buffer.data, &size); + rc = uv_fs_event_getpath(&(handle->fs_event), buffer.out(), &size); break; case UV_FS_POLL: - rc = uv_fs_poll_getpath(&(handle->fs_poll), buffer.data, &size); + rc = uv_fs_poll_getpath(&(handle->fs_poll), buffer.out(), &size); break; default: break; } - if (rc == 0) { - // buffer is not null terminated. - buffer.data[size] = '\0'; - writer->json_keyvalue("filename", buffer.data); - wrote_filename = true; - } } - if (!wrote_filename) writer->json_keyvalue("filename", null); + + if (rc == 0 && size > 0) { + buffer.SetLength(size); + writer->json_keyvalue("filename", buffer.ToStringView()); + } else { + writer->json_keyvalue("filename", null); + } } // Utility function to walk libuv handles. |