On Tue, Nov 17, 2015 at 5:29 AM, Eric Yen <e...@ericyen.com> wrote:
> Hi,
>
> I was wondering could point me in the in the right direction.
> I have a C library running in a thread #1. When works arrive in thread #1,
> work is queued on to a Queue, and the thread wakes up thread #2 through
> uv_async_send, which wakes up the libuv event loop. Thread #2 gets the work
> from the Queue and invokes v8.
>
> A lot of the work enqueued by thread #1 is a small buffer of ~64kb that
> needs to be duplicated before it is enqueued. This memory duplication can be
> slow because of malloc. From my understanding of nodejs, small buffers in
> nodejs are allocated from a managed memory pool, avoiding the need to call
> malloc frequently.
>
> What I would like to do is have thread #1 directly create a node::Buffer /
> Nan;:Buffer, add the work to Queue, and have the uv event loop woken up.
>
> So here's my questions.
> 1)  How can I create an object in thread #1 that will persist in to the
> second thread?
> One option would be to create a Persistent object and then clearing it once
> it's finished.
> Second option, which I'm not sure would work, and I wouldn't know why it
> won't work, would be to create the buffer in thread #1 and Escaping it with
> an EscapableHandlescope.

You can create the Buffer object upfront in the main thread and wrap
it in a strong Persistent handle to prevent the GC from reclaiming it.
You will need to record the pointer to the Buffer's memory separately
because you're not allowed to call node::Buffer::Data() on a different
thread.

Alternatively, you can malloc() the memory on the worker thread and
turn it into a zero-copy Buffer on the main thread.

Put anything involving node.js or V8 on a different thread out of your
head, it won't be reliable (in the
crash-and-eat-your-data-not-reliable sense.)

> 2) Is it even worth it?
> My understanding is that I would have to create a v8::Locker in thread #1 to
> ensure thread safety.
> Would creating and acquiring the v8::Locker be much slower than just
> malloc'ing a small buffer?

Using a v8::Locker won't help because the main thread doesn't release
the isolate when it goes to sleep.  Other threads won't be able to
claim it, they'll just wait forever.

-- 
Job board: http://jobs.nodejs.org/
New group rules: 
https://gist.github.com/othiym23/9886289#file-moderation-policy-md
Old group rules: 
https://github.com/joyent/node/wiki/Mailing-List-Posting-Guidelines
--- 
You received this message because you are subscribed to the Google Groups 
"nodejs" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to nodejs+unsubscr...@googlegroups.com.
To post to this group, send email to nodejs@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/nodejs/CAHQurc_nVk6Pon6Ff%3Dx6nqRnUc557AkXiGB3SQHVjvu6Ezt3Sw%40mail.gmail.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to