On Tue, Apr 9, 2024 at 2:16 AM Ben Creech <b...@bpcreech.com> wrote:
>
> Hey folks,
>
> I've recently adopted the PyMiniRacer project; a minimalistic Python/V8 
> bridge originally created by Sqreen. I revamped a lot of things, including 
> the threading model. I was curious if any experts out there want to take a 
> look at what I've done (it's all on the main branch, with the C++ code here.)
>
> Some questions of varying levels of specificity:
>
> Overall threading design:
> I want to run the message loop indefinitely, processing potentially delayed 
> background work, and receiving new work from multiple (Python) threads. It's 
> particularly confusing how to reconcile the fact that I want an 
> always-running message pump loop (to, e.g., run time-delayed async work like 
> setTimeout callbacks) which AFAICT needs the lock, and run new arbitrary 
> tasks coming in from other threads (from Python).
>
> I didn't see an example of this; the two official examples don't show how to 
> run a program indefinitely (thus I'm using d8 as an example of sorts). (Well, 
> I tried to look at Chromium, but I got lost in the enormous git download, 
> heh.) So I sort of copied the model that the d8 tool seems to use for its 
> workers: I construct the Isolate in the same thread that runs the message 
> pump in a loop until shutdown. The message pump thread grabs the Isolate lock 
> and never gives it up. All interaction with the Isolate then has to be done 
> by either (A) posting tasks to the foreground runner or (B) calling 
> v8::Isolate::TerminateExecution.
>
> So the question is, uh, is that a reasonable model?

Pinning isolates to threads? I'd say so. That's how worker_threads in
Node.js are implemented.

> Thread safety of posting and terminating tasks:
> The above brings up a question: is it actually thread-safe to call 
> v8::Platform::GetForegroundTaskRunner(v8::Isolate *) and 
> v8::TaskRunner::PostTask(std::unique_ptr<v8::Task>) without the isolate lock, 
> as I'm currently assuming it is? It's not documented as safe! But it seems to 
> be safe upon cursory inspection of the implementation?

Yes, I believe it is.

> Does v8::platform::PumpMessageLoop need, get, or release the Isolate lock?
> Another question from the above: does v8::platform::PumpMessageLoop need the 
> Isolate lock? Does it ever unlock the Isolate lock? I.e., if you grab the 
> Isolate lock and then call it with MessageLoopBehavior::kWaitForWork, it 
> seems to sit around with the lock forever.
>
> I think the answers are: yes the message pump needs the lock, and no it never 
> unlocks it... thus my tentative conclusion is that if you're running the 
> message pump in an indefinite loop in blocking mode, you can't interact with 
> your Isolate on another thread. (Thus the task-posting solution: if you want 
> to interact with your Isolate which has its own infinite message loop, just 
> post a task to the task runner and it will run on the message loop. Makes 
> sense! But it's not written down anywhere AFAICT?)

Technically the answer is probably "PumpMessageLoop doesn't need the
lock/is agnostic" but in practice it does because the tasks it
executes do.

> Is it safe to delete a v8::Persistent without the Isolate lock?
> I'm currently doing some awkward things to transport v8::Persistent deletions 
> onto the Isolate task queue, under the guess that it's not safe to delete 
> things without the lock.

No, that's not safe.

> Is it safe to decref a std::shared_ptr<v8::BackingStore> to 0, thus deleting 
> the BackingStore, without the Isolate lock?
> Same as above (but it's even weirder if dropping a std::shared_ptr reference 
> might be thread-unsafe!).

I'm 95% sure the answer is that, yes, it's safe provided your
v8::ArrayBuffer::Allocator implementation is also thread-safe.

> (End of questions.)
>
> Any insight on any of these things would be useful for me, and users of the 
> PyMiniRacer project! It seems to hang together fine under tests, but thread 
> safety is a curious art!
>
> And, while we're here, any other commentary on PyMiniRacer would be very 
> welcome. :)
>
> Thanks,
> Ben Creech

-- 
-- 
v8-users mailing list
v8-users@googlegroups.com
http://groups.google.com/group/v8-users
--- 
You received this message because you are subscribed to the Google Groups 
"v8-users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to v8-users+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/v8-users/CAHQurc9EJhGevJRAU%2BaXzt%2BCQrrLAoCnHa0YLAagoiPHSf4Y8Q%40mail.gmail.com.

Reply via email to