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.
>
Script execution is scattered in the code base so it's hard to guarantee
that. Most of them are short-running, so the problem should be rare, but it
will confuse us when the problem happens.

On Thu, Nov 22, 2018 at 5:25 PM Yang Guo <yang...@chromium.org> wrote:

> 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.
>
I was thinking of introducing a new option, but yes, changing the default
behavior may impact tests and users other than blink.


> 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.
>
That might be possible by migrating
ExceptionState.RethrowV8Exception(v8::Local<v8::Value>) to
ExceptionState.RethrowV8Exception(v8::TryCatch&). yukishiino@, how hard
would it be?


On Thu, Nov 22, 2018 at 5:25 PM Yang Guo <yang...@chromium.org> wrote:

> 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