>
> 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?
>

Bindings is part of Blink.  "after E1" means "after Blink callback exits
back to V8", I think?  Then, there seems no chance for ExceptionState or
any bindings code to do it.

Or, is it okay to call v8::Isolate::TerminateExecution() before Blink exits
back to V8?

2018年11月22日(木) 17:54 Yutaka Hirano <yhir...@chromium.org>:

> 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