summaryrefslogtreecommitdiff
path: root/src/node_report_utils.cc
diff options
context:
space:
mode:
authorAnna Henningsen <anna.henningsen@mongodb.com>2023-02-20 23:01:45 +0100
committerGitHub <noreply@github.com>2023-02-20 22:01:45 +0000
commitb85b5ba10cd782a31e5b1bb26e496b19309e2084 (patch)
tree7740c2e6d2ddd324a889960584e4e356156a0404 /src/node_report_utils.cc
parentff92b40ffcb5f61579f08f95a3586953983bf206 (diff)
downloadnode-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.cc62
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.