On Thu, Nov 8, 2018 at 8:21 PM Yutaka Hirano <yhir...@chromium.org> wrote:

> > As to the problem itself, I have a clarifying questions: doesn't Blink
> already have some choke point to determine whether it's "ok to call script
> now"? If so that'd be a more natural place to add this handling than
> TryCatch.
>
> No, there isn't such a point. To make matters worse, some call-sites don't
> check errors because they don't care.
>
> Sorry for the ignorance but I would like to know V8's policy on
> termination.
>
> 1. What happens if the isolate is forcibly terminated (from another
> thread) while running a script? Will an exception be thrown? Is a
> v8::TryCatch catches the exception?
> 2. What happens if we try to run a script when the isolate has already
> been terminated?
> 3. What happens if v8 calls blink code, the isolate is forcibly terminated
> and then the control is back to v8?
>
>
I'm not intimately familiar with the details here. Yang or Toon, perhaps
you have more insight?


>
>
> On Fri, Nov 9, 2018 at 5:30 AM Adam Klein <ad...@chromium.org> wrote:
>
>> Adding a couple more V8 folks who may have thoughts.
>>
>> On Thu, Nov 8, 2018 at 1:59 AM Kentaro Hara <hara...@chromium.org> wrote:
>>
>>> On Thu, Nov 8, 2018 at 1:10 AM Yuki Shiino <yukishi...@chromium.org>
>>> wrote:
>>>
>>>> +adamk, cbruni to get more attention from V8 team.  This needs V8
>>>> team's support.
>>>>
>>>> Actually, I intended haraken's (a3) at my proposal (a), but I'm afraid
>>>> that changing an existing API HasCaught() would break backward
>>>> compatibility.  So, I'm also proposing to add a new V8 API like
>>>> v8::TryCatch::HasPendingException or v8::TryCatch::HasCaughtOrTerminated or
>>>> whatever we call it.
>>>>
>>>> By the way, the example code is just an example.  Usually we don't have
>>>> two TryCatch blocks next to each other, and Blink is rethrowing the
>>>> exception in most cases.  I just forgot to write rethrow in the example.
>>>> That's not a point.  Let me revise the example.
>>>>
>>>> Main thread:
>>>>     v8::Isolate* worker_isolate = ...;
>>>>     worker_isolate->TerminateExecution();  // Terminates the worker
>>>> isolate.
>>>>
>>>> Worker thread (worker isolate):
>>>>     Foo();  // The v8::Isolate terminates during execution of Foo.
>>>>     Bar();
>>>>
>>>> where Foo and Bar are the followings.
>>>>
>>>>     void Foo() {
>>>>       v8::TryCatch try_catch1(isolate);
>>>>       // Call V8 APIs.  The v8::Isolate gets terminated at this point.
>>>>       if (try_catch1.HasCaught()) {  // => true due to the termination
>>>> exception.
>>>>         // Rethrow or report the error to global error handlers.
>>>>         return;
>>>>       }
>>>>     }
>>>>
>>>>     void Bar() {
>>>>       v8::TryCatch try_catch2(isolate);
>>>>       // Call V8 APIs.  V8 APIs fail because the isolate is terminating.
>>>>       if (try_catch2.HasCaught()) {  // => false because no new
>>>> exception is thrown inside |try_catch2| scope.
>>>>         // Rethrow or report the error to global error handlers.
>>>>         return;
>>>>       }
>>>>       // Blink reaches here.  :(
>>>>     }
>>>>
>>>
>>> Hmm, I'm a bit confused.
>>>
>>> If Foo() rethrows the exception, why does the worker thread continue
>>> execution and call Bar()? That will cause a problem even when the worker is
>>> not terminated (because the worker continues execution ignoring the thrown
>>> exception)...?
>>>
>>> Also I might want to understand how widely the problem is happening.
>>> First of all, it is not realistic to handle worker's sudden termination in
>>> 100% cases (unless we add checks to all V8 API calls in the Blink code
>>> base). So the best thing we can do is to insert the termination check to
>>> places that may call scripts (e.g., V8ScriptRunner, EventListener, Promise
>>> resolve / reject etc) and reduce the crash rate. We could introduce
>>> HasCaughtOrTerminated() if it helps to reduce the crash rate, but I want to
>>> make sure that assumption is correct. My intuition is that it will be more
>>> useful to identify places that may call scripts often and insert the
>>> termination checks if missing.
>>>
>>
>> I'd similarly like to understand how much this happens in practice.
>>
>>
>>> A proposed solution looks like the following.
>>>>
>>>>     v8::TryCatch try_catch(isolate);
>>>>     // ...
>>>>     if (try_catch.*HasCaughtOrTerminated*()) {
>>>>       v8::Local<v8::Exception> exception = try_catch.
>>>> *CaughtExceptionOrTerminationException*();
>>>>       // Do a job with |exception|.
>>>>       return;
>>>>     }
>>>>
>>>> where HasCaughtOrTerminated returns true when the isolate is
>>>> terminating even if no exception is thrown inside the TryCatch scope, and
>>>> CaughtExceptionOrTerminationException returns a thrown exception if an
>>>> exception is thrown inside the TryCatch scope or the termination exception
>>>> if the isolate is terminating.
>>>>
>>>
>> As to the problem itself, I have a clarifying questions: doesn't Blink
>> already have some choke point to determine whether it's "ok to call script
>> now"? If so that'd be a more natural place to add this handling than
>> TryCatch.
>>
>> - Adam
>>
>>
>>> Cheers,
>>>> Yuki Shiino
>>>>
>>>>
>>>> 2018年11月8日(木) 17:38 Kentaro Hara <hara...@chromium.org>:
>>>>
>>>>> Thanks, I got it :)
>>>>>
>>>>> My proposal would be:
>>>>>
>>>>> (a3) Make HasCaught() return true when the isolate is terminated.
>>>>>
>>>>> I'm not sure if (a) or (a2) is a good idea because the fact that we
>>>>> didn't call ReThrow() means that we (intentionally) suppressed the
>>>>> exception. Thoughts?
>>>>>
>>>>>
>>>>>
>>>>>
>>>>> On Wed, Nov 7, 2018 at 9:51 PM Yuki Shiino <yukishi...@chromium.org>
>>>>> wrote:
>>>>>
>>>>>> Are you assuming that the worker is terminated while it's calling
>>>>>>> DoSomethingElseWithV8()? If yes, why does HasCaught() not return true? 
>>>>>>> If
>>>>>>> no, what's a problem of continuing execution?
>>>>>>
>>>>>>
>>>>>> No, the worker is terminated while DoSomethingWithV8 (without
>>>>>> "Else"), and Blink continues running more V8 code at
>>>>>> DoSomethingElseWithV8.  Two pieces of code run consecutively.
>>>>>>
>>>>>> Worker thread (worker isolate):
>>>>>>     {
>>>>>>       v8::TryCatch try_catch(isolate);
>>>>>>       DoSomethingWithV8();  // The Isolate terminates here.
>>>>>>       if (try_catch.HasCaught()) {  // => true due to termination
>>>>>>         // Handle error or termination.
>>>>>>         return;
>>>>>>       }
>>>>>>     }
>>>>>>     {
>>>>>>       v8::TryCatch try_catch(isolate);
>>>>>>       DoSomethingElseWithV8();  // V8 APIs fail because the Isolate
>>>>>> is terminating.
>>>>>>       if (try_catch.HasCaught()) {  // => false because no new
>>>>>> exception is thrown inside the v8::TryCatch.
>>>>>>         return;  // Blink doesn't reach here.
>>>>>>       }
>>>>>>       // Blink reach here instead.  :(
>>>>>>     }
>>>>>>
>>>>>> IIUC, the second try_catch.HasCaught() doesn't return true because
>>>>>> there is no new exception thrown inside the v8::TryCatch scope, although 
>>>>>> V8
>>>>>> APIs fail inside DoSomethingElseWithV8 due to a pending termination
>>>>>> exception.
>>>>>>
>>>>>> Cheers,
>>>>>> Yuki Shiino
>>>>>>
>>>>>>
>>>>>> 2018年11月8日(木) 3:18 Kentaro Hara <hara...@chromium.org>:
>>>>>>
>>>>>>> Sorry, I'm not sure if I understand your example...
>>>>>>>
>>>>>>>
>>>>>>> On Wed, Nov 7, 2018 at 2:21 AM Yutaka Hirano <yhir...@chromium.org>
>>>>>>> wrote:
>>>>>>>
>>>>>>>> +ricea@
>>>>>>>>
>>>>>>>> On Wed, Nov 7, 2018 at 6:44 PM Yuki Shiino <yukishi...@chromium.org>
>>>>>>>> wrote:
>>>>>>>>
>>>>>>>>> Hi V8-team and platform-architecture-dev,
>>>>>>>>>
>>>>>>>>> TL;DR: We'd like to extend v8::TryCatch APIs a little.
>>>>>>>>>
>>>>>>>>> We're having an issue how to handle worker termination, i.e.
>>>>>>>>> v8::Isolate termination.  Roughly speaking, the situation is like 
>>>>>>>>> below.
>>>>>>>>>
>>>>>>>>> Main thread:
>>>>>>>>>     v8::Isolate* worker_isolate = ...;
>>>>>>>>>     worker_isolate->TerminateExecution();  // Terminates the
>>>>>>>>> worker isolate.
>>>>>>>>>
>>>>>>>>> Worker thread (worker isolate):
>>>>>>>>>     v8::TryCatch try_catch(isolate);
>>>>>>>>>     DoSomethingWithV8();  // The Isolate terminates here.
>>>>>>>>>     if (try_catch.HasCaught()) {  // => true due to termination
>>>>>>>>>       // Handle error or termination.
>>>>>>>>>       return;
>>>>>>>>>     }
>>>>>>>>>
>>>>>>>>> No problem so far.  Worker thread MUST NOT run any V8 code no
>>>>>>>>> longer because the Isolate is terminating.  However, Blink is not 
>>>>>>>>> perfect,
>>>>>>>>> and it's pretty tough for Blink to stop everything with 100% 
>>>>>>>>> correctness.
>>>>>>>>> Occasionally (or rarely) Blink continues running more V8 code like 
>>>>>>>>> below.
>>>>>>>>>
>>>>>>>>> Worker thread (worker isolate):
>>>>>>>>>     v8::TryCatch try_catch(isolate);
>>>>>>>>>     DoSomethingElseWithV8();
>>>>>>>>>     if (try_catch.HasCaught()) {  // => false because no new
>>>>>>>>> exception is thrown inside the v8::TryCatch.
>>>>>>>>>       return;  // Blink doesn't reach here.
>>>>>>>>>     }
>>>>>>>>>     // Blink reach here instead.  :(
>>>>>>>>>
>>>>>>>>> If v8::TryCatch::HasCaught() returned true, Blink would be able to
>>>>>>>>> handle it as error and Blink would work much better than now (Blink 
>>>>>>>>> is now
>>>>>>>>> crashing).
>>>>>>>>>
>>>>>>>>
>>>>>>> Are you assuming that the worker is terminated while it's calling
>>>>>>> DoSomethingElseWithV8()? If yes, why does HasCaught() not return true? 
>>>>>>> If
>>>>>>> no, what's a problem of continuing execution?
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>>> So, proposals here are something like below (not yet so concrete).
>>>>>>>>>
>>>>>>>>> a) Make v8::TryCatch::HasCaught() return true if there already
>>>>>>>>> exists a pending exception.  (Maybe this is no good.)
>>>>>>>>> b) Make a new API like v8::TryCatch::HasPendingException() and
>>>>>>>>> make it return true.  Blink rewrites all HasCaught() to the new one.
>>>>>>>>>
>>>>>>>>> Similarly,
>>>>>>>>>
>>>>>>>>> a2) Make v8::TryCatch::Exception() return a pending exception if
>>>>>>>>> there already exists.
>>>>>>>>> b2) Make a new API like v8::TryCatch::PendingException() and make
>>>>>>>>> it return a thrown exception or pending exception in the isolate if 
>>>>>>>>> any.
>>>>>>>>> Blink rewrites all Exception() to the new one.
>>>>>>>>>
>>>>>>>>> What do you think of the issue and proposals?
>>>>>>>>>
>>>>>>>>> Cheers,
>>>>>>>>> Yuki Shiino
>>>>>>>>>
>>>>>>>>> --
>>>>>>>> You received this message because you are subscribed to the Google
>>>>>>>> Groups "platform-architecture-dev" group.
>>>>>>>> To unsubscribe from this group and stop receiving emails from it,
>>>>>>>> send an email to platform-architecture-dev+unsubscr...@chromium.org
>>>>>>>> .
>>>>>>>> To post to this group, send email to
>>>>>>>> platform-architecture-...@chromium.org.
>>>>>>>> To view this discussion on the web visit
>>>>>>>> https://groups.google.com/a/chromium.org/d/msgid/platform-architecture-dev/CABihn6ER8q9QABC3ROCSkm6V4w%2BDb0xEqRvjgzwBpMG9DmiG1Q%40mail.gmail.com
>>>>>>>> <https://groups.google.com/a/chromium.org/d/msgid/platform-architecture-dev/CABihn6ER8q9QABC3ROCSkm6V4w%2BDb0xEqRvjgzwBpMG9DmiG1Q%40mail.gmail.com?utm_medium=email&utm_source=footer>
>>>>>>>> .
>>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>> --
>>>>>>> Kentaro Hara, Tokyo, Japan
>>>>>>>
>>>>>>
>>>>>
>>>>> --
>>>>> Kentaro Hara, Tokyo, Japan
>>>>>
>>>>
>>>
>>> --
>>> Kentaro Hara, Tokyo, Japan
>>>
>>> --
>>> You received this message because you are subscribed to the Google
>>> Groups "platform-architecture-dev" group.
>>> To unsubscribe from this group and stop receiving emails from it, send
>>> an email to platform-architecture-dev+unsubscr...@chromium.org.
>>> To post to this group, send email to
>>> platform-architecture-...@chromium.org.
>>> To view this discussion on the web visit
>>> https://groups.google.com/a/chromium.org/d/msgid/platform-architecture-dev/CABg10jx51JXHEt0H9z%3DzT%3D0GnhDf79QjhGtVxRc%3Dy-RXjHXUyw%40mail.gmail.com
>>> <https://groups.google.com/a/chromium.org/d/msgid/platform-architecture-dev/CABg10jx51JXHEt0H9z%3DzT%3D0GnhDf79QjhGtVxRc%3Dy-RXjHXUyw%40mail.gmail.com?utm_medium=email&utm_source=footer>
>>> .
>>>
>> --
> You received this message because you are subscribed to the Google Groups
> "platform-architecture-dev" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to platform-architecture-dev+unsubscr...@chromium.org.
> To post to this group, send email to
> platform-architecture-...@chromium.org.
> To view this discussion on the web visit
> https://groups.google.com/a/chromium.org/d/msgid/platform-architecture-dev/CABihn6GKuTUs5UfpbQ6RwXq%3DWw0dDUJkq2JLzadnesfjLG%3DStg%40mail.gmail.com
> <https://groups.google.com/a/chromium.org/d/msgid/platform-architecture-dev/CABihn6GKuTUs5UfpbQ6RwXq%3DWw0dDUJkq2JLzadnesfjLG%3DStg%40mail.gmail.com?utm_medium=email&utm_source=footer>
> .
>

-- 
-- 
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.
For more options, visit https://groups.google.com/d/optout.

Reply via email to