Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

src: use v8::LocalVector instead of MaybeStackBuffer<Value> #54934

Closed
wants to merge 3 commits into from

Conversation

jasnell
Copy link
Member

@jasnell jasnell commented Sep 13, 2024

No description provided.

@nodejs-github-bot
Copy link
Collaborator

Review requested:

  • @nodejs/crypto
  • @nodejs/http2
  • @nodejs/net

@nodejs-github-bot nodejs-github-bot added c++ Issues and PRs that require attention from people who are familiar with C++. lib / src Issues and PRs related to general changes in the lib or src directory. needs-ci PRs that need a full CI run. labels Sep 13, 2024
@nodejs-github-bot

This comment was marked as outdated.

This comment was marked as outdated.

@nodejs-github-bot
Copy link
Collaborator

@@ -215,14 +216,14 @@ MaybeLocal<Value> InternalMakeCallback(Environment* env,

Local<Context> context = env->context();
if (use_async_hooks_trampoline) {
MaybeStackBuffer<Local<Value>, 16> args(3 + argc);
LocalVector<Value> args(env->isolate(), 3 + argc);
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Did you benchmark this? The point of MaybeStackBuffer is to avoid an extra heap allocation, as the name implies, a benefit that gets lost when switching to LocalVector

Copy link
Member

@joyeecheung joyeecheung Sep 17, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think we probably don't have a choice according to https://chromium-review.googlesource.com/c/v8/v8/+/4905902 - the Local handles are not supposed to be heap-allocated in the usual fashion, so a MaybeStackBuffer<Local<>> that heap-allocates (when the size > kStackStorageSize) is invalid in the first place and we were probably just being lucky to dodge some memory failures that could be caused by it (or maybe we'll get hit when V8 enables conservative stack scanning). LocalVector was added as a V8-acknowledged way to properly heap allocate them.

Copy link
Member

@joyeecheung joyeecheung Sep 17, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Although, another way to go with this while preserving the stack-allocation part may be to add a different MaybeStackBuffer that uses LocalVector when it goes heap-allocated, or add some specialization to MaybeStackBuffer so that the heap-allocated part uses LocalVector when the element type is Local (seems messier though).

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@joyeecheung Yeah, those sound like good ideas for solving this problem to me 🙂

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Q: How can we disallow heap allocation on Local handles? What's the best way?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Let's see if it breaks here as well. Thanks for the tip @targos: cloudflare/workerd#2752

@anonrig anonrig added the needs-benchmark-ci PR that need a benchmark CI run. label Sep 15, 2024
@jasnell
Copy link
Member Author

jasnell commented Sep 21, 2024

Closing given the feedback

@jasnell jasnell closed this Sep 21, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
c++ Issues and PRs that require attention from people who are familiar with C++. lib / src Issues and PRs related to general changes in the lib or src directory. needs-benchmark-ci PR that need a benchmark CI run. needs-ci PRs that need a full CI run.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

7 participants