Hi,
I´ve made several tests with TerminateExecution() running the endless loop 
with sleep.
As I mentioned, the test environment was:
1 Isolate, 1 common Context, 1 global object
Several threads – using v8::Lock/Unlock running the JS functions: 
while(true) { sleep(1); } – where sleep is a JS FunctionTemplate extension 
and it does what its name suggests.
Call TerminateExecution() for all of the threads running the JS function.

The result was almost every time that 1 thread did not terminate the JS 
function. However in some cases it worked fine. I just wanted to see more 
info, so I modified the JS script:
counter = {};
counter[scriptName] = 0;
while(true){
++counter[scriptName];
sleep(1);
}

The global variable counter is an object containing the loop count for each 
script. scriptName was different in each thread running the JS function. 
Before I called TerminateExecution(), I set counter[scriptName] = 0;

And … it worked. All threads terminated the execution. The loop counts were 
between some hundreds to some thousands.

It seemed to be a timing Problem. I’ve produced more loads on the computer, 
and I repeated the tests. And it happened again. One thread did not 
terminate the execution. All other threads – I‘ve tested up to 10 threads – 
terminated the execution with some thousands loop count, but 1 was still 
running. And it was not always the same. But I could display the loop 
count. I waited more than 600000 and one time I left to run through the 
night – no termination.
I wanted to stop the execution with the following JS function: ‘counter = 
{}’. I started this function in another thread, and expected a 
ReferenceError Exception as counter[scriptName] did not exist anymore. The 
execution terminated with an Exception; however it was an uncaughtable 
Exception. That should be produced by TerminateExecution(). 
As I understand, it means, that the v8 thread recognized the 
TerminateExecution() request, but it did not stop the iteration of the 
termination.
Unfortunately I cannot reproduce this behavior in simple test case. It just 
happens in my application. I hope, this info is useful for the development.

The tests showed, that requesting the termination may take several 
thousands of iterations and in some cases the iteration does not terminate 
– interestingly always only for one thread. I could not find any public v8 
functions that reflect this state of the v8 thread: iterating for 
termination. Is it possible to interrogate this state? If not, it would be 
nice to have a function like v8::V8::IsExecutionTerminationRequested(). 
Time consuming C++ extensions could be aborted without waiting for end of 
termination iteration.

Thank you, 

Laszlo

On Monday, April 8, 2013 4:28:54 PM UTC+2, Laszlo Szakony wrote:
>
> I understand 'in parallel' that the threads running the JS functions use 
> the same Context hence the same global object - with every implication of 
> course. The synchronization is done by v8::Locker, so no thread is 
> accessing the isolate without acquiring the  v8::Lock. Sorry for the 
> confusion. The question is still, if some circumstances exists, 
> where TerminateExecution() does not terminate the execution of a running JS 
> function in such an environment?
>
> Am Montag, 8. April 2013 16:13:08 UTC+2 schrieb Jakob Kummerow:
>>
>> Earlier you said that "several scripts are running [in] parallel". 
>> That's precisely what's not supported. Sven was pointing out that when 
>> several threads need to access an isolate, they can do so, but only *one at 
>> a time*. No two threads can be allowed to run in the same isolate at the 
>> same time, or very weird things will begin to happen (the observation about 
>> the constant sum of loop counts is just a mildly amusing, harmless example; 
>> you could also have data loss, crashes and whatnot).
>>
>>
>> On Mon, Apr 8, 2013 at 3:35 PM, Laszlo Szakony <laszlo....@certec.at>wrote:
>>
>>> That`s what I`m doing. I have one Context in the default isolate - one 
>>> global object - and several threads running JS functions. Each thread uses 
>>> v8::Locker for synchronization.
>>> Can I call in this case TerminateExecution() for each thread or not? It 
>>> seems to work up to the sleep() problem, where 1 thread remains running.
>>>
>>> Am Montag, 8. April 2013 15:17:13 UTC+2 schrieb Sven Panne:
>>>
>>>> Just a quick drive-by comment: You *can* use an Isolate from various 
>>>> threads, but you'll have to use a v8::Locker in all threads then. This 
>>>> way, 
>>>> you inform v8 about your thread switches and make sure that at any given 
>>>> point in time at most one thread is actively using an Isolate.
>>>>
>>>  -- 
>>> -- 
>>> v8-users mailing list
>>> v8-u...@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+u...@googlegroups.com.
>>> For more options, visit https://groups.google.com/groups/opt_out.
>>>  
>>>  
>>>
>>
>>

-- 
-- 
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/groups/opt_out.


Reply via email to