I could change V8 to not clear the termination exception so that we always
stay in the terminated mode and not recover. However, from experience I
expect tons of tests to fail if I implemented this change.

What you could do is add a check after E1 for
v8::TryCatch::HasTerminated(), and schedule another
Isolate::TerminateExecution() if true. You would need to do this for E2 as
well, if you expect an E3, and so forth.

Cheers,

Yang

On Thu, Nov 22, 2018 at 8:53 AM Kentaro Hara <hara...@chromium.org> wrote:

> Would it be hard to make Blink immediately terminate the worker thread
> after E1 is forcibly terminated?
>
> Blink is already doing that for common script execution paths e.g., event
> listeners, call functions etc.
>
>
> On Thu, Nov 22, 2018 at 4:34 PM Yutaka Hirano <yhir...@chromium.org>
> wrote:
>
>> Thanks for the reply.
>>
>> As Kentaro said, Blink uses TerminateExecution only when it tries to
>> terminate a worker thread forcibly. The isolation will soon be disposed,
>> and the "recovering" functionality is actually harmful for us.
>>
>> main     -----T------------
>> worker   --*E1**--*E2******
>>
>> T: Call TerminateExecution with the worker isolate (on the main thread)
>> E1: bottom-most script evaluation (* means running)
>> E2: bottom-most script evaluation (* means running)
>>
>> In this case, the main thread wants to terminate the worker thread, but
>> it calls TerminateExecution only once so it E2 runs potentially forever.
>> If there is an option that ensures that future v8 calls will fail
>> whenever possible and the v8::TryCatch scope around that will return
>> true for v8::TryCatch::HasCaught, then we'll be happy. Is it possible?
>>
>>
>> On Mon, Nov 19, 2018 at 7:27 PM Yutaka Hirano <yhir...@chromium.org>
>> wrote:
>>
>>> Hi,
>>>
>>> Let's consider the following sequence.
>>>
>>> -----------------------------> time
>>>
>>> main     -----T------------
>>> worker   --*E1**--*E2***---
>>>
>>> T: Call TerminateExecution with the worker isolate (on the main thread)
>>> E1: bottom-most script evaluation (* means running)
>>> E2: bottom-most script evaluation (* means running)
>>>
>>> In this case, E1 is terminated due to TerminateExecution, but E2 runs
>>> normally (i.e., may return a non-empty value) because "the isolate is good
>>> to be re-used again", right?
>>>
>>> Another question: If E1 starts running after TerminateExecution is
>>> called, what happens?
>>>
>>> main     T-----------------
>>> worker   --*E1**-----------
>>>
>>> T: Call TerminateExecution with the worker isolate (on the main thread)
>>> E1: bottom-most script evaluation (* means running)
>>>
>>> Will E1 be aborted due to a past TerminateExecution call, or will it run
>>> because "the isolate is good to be re-used again"?
>>>
>>> Thanks,
>>>
>>>
>>> On Mon, Nov 19, 2018 at 3:28 PM Yang Guo <yang...@chromium.org> wrote:
>>>
>>>> Sorry. I should have been more explicit here. My image of the stack is
>>>> growing bottom up. So A is the bottom-most V8 call.
>>>>
>>>> Yang
>>>>
>>>> On Mon, Nov 19, 2018 at 5:42 AM Yutaka Hirano <yhir...@chromium.org>
>>>> wrote:
>>>>
>>>>> Hi,
>>>>>
>>>>> I found I don't understand the direction. If there are only two
>>>>> levels, say blink-calls-v8(A)-calls-blink-calls-v8(B), which is the
>>>>> bottom-most v8 call, A or B?
>>>>>
>>>>> Thanks,
>>>>>
>>>>> On Fri, Nov 16, 2018 at 6:30 PM Yutaka Hirano <yhir...@chromium.org>
>>>>> wrote:
>>>>>
>>>>>> Hi Yang,
>>>>>>
>>>>>> Thank you for the information!
>>>>>> Sorry for the late response. I will send a reply next week.
>>>>>>
>>>>>> Thanks,
>>>>>>
>>>>>>
>>>>>> On Thu, Nov 15, 2018 at 9:33 PM Kentaro Hara <hara...@chromium.org>
>>>>>> wrote:
>>>>>>
>>>>>>> I found that at the only place Isolate::TerminateExecution is called
>>>>>>>> <https://cs.chromium.org/chromium/src/third_party/blink/renderer/core/workers/worker_thread.cc?type=cs&sq=package:chromium&g=0&l=415>
>>>>>>>>  from
>>>>>>>> blink, V8 is not even running. That would mean that we don't have to 
>>>>>>>> worry
>>>>>>>> about any of this?
>>>>>>>
>>>>>>>
>>>>>>> At that place the main thread (which is not running V8) is calling
>>>>>>> TerminateExecution to terminate a running worker thread. The concern is 
>>>>>>> on
>>>>>>> the worker thread.
>>>>>>>
>>>>>>>
>>>>>>> On Thu, Nov 15, 2018 at 6:51 PM Yang Guo <yang...@chromium.org>
>>>>>>> wrote:
>>>>>>>
>>>>>>>> Hi,
>>>>>>>>
>>>>>>>> I found that at the only place Isolate::TerminateExecution is
>>>>>>>> called
>>>>>>>> <https://cs.chromium.org/chromium/src/third_party/blink/renderer/core/workers/worker_thread.cc?type=cs&sq=package:chromium&g=0&l=415>
>>>>>>>>  from
>>>>>>>> blink, V8 is not even running. That would mean that we don't have to 
>>>>>>>> worry
>>>>>>>> about any of this?
>>>>>>>>
>>>>>>>> Cheers,
>>>>>>>>
>>>>>>>> Yang
>>>>>>>>
>>>>>>>> On Wed, Nov 14, 2018 at 10:00 AM Yang Guo <yang...@chromium.org>
>>>>>>>> wrote:
>>>>>>>>
>>>>>>>>> I filed a bug for the slightly counter-intuitive behavior I
>>>>>>>>> mentioned: https://bugs.chromium.org/p/v8/issues/detail?id=8455
>>>>>>>>>
>>>>>>>>> Cheers,
>>>>>>>>>
>>>>>>>>> Yang
>>>>>>>>>
>>>>>>>>> On Wed, Nov 14, 2018 at 9:01 AM Yang Guo <yang...@chromium.org>
>>>>>>>>> wrote:
>>>>>>>>>
>>>>>>>>>> When you terminate execution in V8, we abort execution until the
>>>>>>>>>> bottom-most call into V8. If you have re-entries into V8, V8 always 
>>>>>>>>>> returns
>>>>>>>>>> empty results until the bottom-most call into V8. On the Blink side 
>>>>>>>>>> on the
>>>>>>>>>> stack of the re-entries, you can try to call into V8 before 
>>>>>>>>>> returning, but
>>>>>>>>>> that will simply return empty results. v8::TryCatch scopes along the 
>>>>>>>>>> way
>>>>>>>>>> will return true for v8::TryCatch::HasCaught and
>>>>>>>>>> v8::TryCatch::HasTerminated. Isolate::IsExecutionTerminating returns 
>>>>>>>>>> true.
>>>>>>>>>>
>>>>>>>>>> As soon as we reach the bottom-most call, we return with an empty
>>>>>>>>>> value as well. The v8::TryCatch scope around that will return true 
>>>>>>>>>> for
>>>>>>>>>> v8::TryCatch::HasCaught and v8::TryCatch::HasTerminated, but
>>>>>>>>>> Isolate::IsExecutionTerminating will return false (even if you are 
>>>>>>>>>> still
>>>>>>>>>> inside this outer-most v8::TryCatch scope), because you can safely 
>>>>>>>>>> call
>>>>>>>>>> into V8 again, from here on. I actually find this a bit 
>>>>>>>>>> counter-intuitive,
>>>>>>>>>> and it might be better to have Isolate::IsExecutionTerminating 
>>>>>>>>>> return true,
>>>>>>>>>> until we leave the outer-most v8::TryCatch. Though implementing that 
>>>>>>>>>> seems
>>>>>>>>>> a bit annoying.
>>>>>>>>>>
>>>>>>>>>> So what you are observing is that you have a non-reentry call to
>>>>>>>>>> execute the worker. That terminates, and you then have another 
>>>>>>>>>> non-reentry
>>>>>>>>>> call. That is working as intended though. Once you have left V8 
>>>>>>>>>> through
>>>>>>>>>> termination across all re-entries, the isolate is good to be re-used 
>>>>>>>>>> again.
>>>>>>>>>> I think the correct way to fix your issue is to, at non-reentry 
>>>>>>>>>> calls, *always
>>>>>>>>>> check for v8::TryCatch::HasTerminated, and use that to guide the 
>>>>>>>>>> following
>>>>>>>>>> control flow*.
>>>>>>>>>>
>>>>>>>>>> To answer your questions:
>>>>>>>>>>
>>>>>>>>>>> 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?
>>>>>>>>>>
>>>>>>>>>> Internally we throw a special exception that cannot be caught by
>>>>>>>>>> javascript. This exception causes execution to abort until we arrive 
>>>>>>>>>> at the
>>>>>>>>>> first (non-reentry) call into V8.
>>>>>>>>>>
>>>>>>>>>> 2. What happens if we try to run a script when the isolate has
>>>>>>>>>>> already been terminated?
>>>>>>>>>>
>>>>>>>>>> If you completely exited V8 back to the first non-reentry call,
>>>>>>>>>> you can safely use the isolate again.
>>>>>>>>>>
>>>>>>>>>> 3. What happens if v8 calls blink code, the isolate is forcibly
>>>>>>>>>>> terminated and then the control is back to v8?
>>>>>>>>>>
>>>>>>>>>> The termination exception is propagated back to V8, causes the
>>>>>>>>>> current execution to abort, so that we return an empty value to 
>>>>>>>>>> blink as
>>>>>>>>>> soon as possible. If this blink frame is called from V8, then 
>>>>>>>>>> calling into
>>>>>>>>>> V8 will only result in empty values.
>>>>>>>>>>
>>>>>>>>>> Cheers,
>>>>>>>>>>
>>>>>>>>>> Yang
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> On Sat, Nov 10, 2018 at 12:15 AM Adam Klein <ad...@chromium.org>
>>>>>>>>>> wrote:
>>>>>>>>>>
>>>>>>>>>>> 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>
>>>>>>>>>>>> .
>>>>>>>>>>>>
>>>>>>>>>>> --
>>>>>>>>>>> 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/CAEvLGcKKKdZ4-Svz7NmXdzSaL9ryQz4cPEqhTfmWEURzwTdMqQ%40mail.gmail.com
>>>>>>>>>>> <https://groups.google.com/a/chromium.org/d/msgid/platform-architecture-dev/CAEvLGcKKKdZ4-Svz7NmXdzSaL9ryQz4cPEqhTfmWEURzwTdMqQ%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/CAFSTc_iBZUPpYMuUk3ouOe7cLBDizJFUjmcWuaAeVZfMBn4QqQ%40mail.gmail.com
>>>>>>>> <https://groups.google.com/a/chromium.org/d/msgid/platform-architecture-dev/CAFSTc_iBZUPpYMuUk3ouOe7cLBDizJFUjmcWuaAeVZfMBn4QqQ%40mail.gmail.com?utm_medium=email&utm_source=footer>
>>>>>>>> .
>>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>> --
>>>>>>> Kentaro Hara, Tokyo, Japan
>>>>>>>
>>>>>>> --
>>>>>>> --
>>>>>>> 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.
>>>>>>>
>>>>>> --
>>>>> 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/CABihn6H0_3BFq5S2wv5Y8CDyW%3Dv-HjwskH1Wds6PmTWX5akE9g%40mail.gmail.com
>>>>> <https://groups.google.com/a/chromium.org/d/msgid/platform-architecture-dev/CABihn6H0_3BFq5S2wv5Y8CDyW%3Dv-HjwskH1Wds6PmTWX5akE9g%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/CABihn6F4PfQJML_kNgt5Et2nhfQfVBuXYqaNyHyORAGtbVbEjg%40mail.gmail.com
>> <https://groups.google.com/a/chromium.org/d/msgid/platform-architecture-dev/CABihn6F4PfQJML_kNgt5Et2nhfQfVBuXYqaNyHyORAGtbVbEjg%40mail.gmail.com?utm_medium=email&utm_source=footer>
>> .
>>
>
>
> --
> 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/CABg10jz-oO0wE0ZGzdZ8%3DuXdZdj7UvR_KKG_12%2B_-67-LA_2Cw%40mail.gmail.com
> <https://groups.google.com/a/chromium.org/d/msgid/platform-architecture-dev/CABg10jz-oO0wE0ZGzdZ8%3DuXdZdj7UvR_KKG_12%2B_-67-LA_2Cw%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