I didn't realize that you had several threads running at the same time in the same isolate. V8 is not designed for this, and you could hit all sorts of "interesting" behavior. You should use a separate isolate for each thread.
On Mon, Apr 8, 2013 at 10:59 AM, Laszlo Szakony <laszlo.szak...@certec.at>wrote: > Hi Jakob, > > thank you for the detailed explanation. > You are right. The execution was terminated after a long time with > sleep(500), and with sleep(1) the execution terminated in a few seconds. > Though my formulation of title of theme was not correct, your answer > helped me to analyse the real problem. > I don´t want to terminate the thread(s) running the isolate. I just want > to terminate the execution the currently running JS function in the isolate. > Using sleep() was just a tool setup a reproducible test environment. The > tests in my system were setup as follows: > - Start 20 isolates running the JS function "function f() { > while(true){sleep(10);} } f();" > - Call v8::TerminateExecution(thread_id) for the 20 isolates running the > same JS code. > - PROBLEM: All but one isolate terminated the execution of JS code in a > few seconds. > - The remaining isolate continued running the JS code, even calling > v8::TerminateExecution(thread_id) several times. > > So I modified in 'cctest' the file 'test-thread-termination.cc' to > reproduce the behavior, but without success. It worked fine. > But I observed, that terminating the first isolate happens mach faster, > then terminating the remaining ones. > The test is as follows: > - Start 3 isolates running the JS funciton "function f() { sleep(1000); > while(true){sleep(1);} } f();" > - Call v8::TerminateExecution(thread_id) for the 3 isolates running the > same JS code. > - I stored the looping count in the while loop, and printed at the end. > Here are the results: > > Seconds Message > ==================================================== > 00.000 Started Thread : 2 > 00.007 Thread 2 sleeping for 1000 millisec > 00.007 Started Thread : 3 > 00.008 Thread 3 sleeping for 1000 millisec > 00.009 Started Thread : 4 > 00.017 Thread 4 sleeping for 1000 millisec > 00.018 Terminating Thread 2 > 00.019 Terminating Thread 3 > 00.021 Terminating Thread 4 > 01.007 Thread 2 sleeping over for 1000 millisec > 01.009 Thread 3 sleeping over for 1000 millisec > 01.018 Thread 4 sleeping over for 1000 millisec > 01.133 Finished Thread : 2 with loop count : 0 > 04.110 Finished Thread : 4 with loop count : 2939 > 04.111 Finished Thread : 3 with loop count : 2951 > 04.113 Sum of loop counts : 5890 > > I repeated the test with different number of isolates, the result was > always the same: > > 00.000 Started Thread : 2 > 00.012 Thread 2 sleeping for 1000 millisec > 00.013 Started Thread : 3 > 00.018 Thread 3 sleeping for 1000 millisec > 00.018 Started Thread : 4 > 00.020 Thread 4 sleeping for 1000 millisec > 00.020 Started Thread : 5 > 00.032 Started Thread : 6 > 00.034 Thread 6 sleeping for 1000 millisec > 00.044 Thread 5 sleeping for 1000 millisec > 00.045 Terminating Thread 2 > 00.046 Terminating Thread 5 > 00.047 Terminating Thread 3 > 00.048 Terminating Thread 6 > 00.048 Terminating Thread 4 > 01.012 Thread 2 sleeping over for 1000 millisec > 01.018 Thread 3 sleeping over for 1000 millisec > 01.020 Thread 4 sleeping over for 1000 millisec > 01.044 Thread 6 sleeping over for 1000 millisec > 01.045 Thread 5 sleeping over for 1000 millisec > 01.065 Finished Thread : 2 with loop count : 0 > 02.568 Finished Thread : 3 with loop count : 1475 > 02.570 Finished Thread : 6 with loop count : 1471 > 02.572 Finished Thread : 5 with loop count : 1471 > 02.577 Finished Thread : 4 with loop count : 1475 > 02.580 Sum of loop counts : 5892 > > Interesting is, that the sum of the loop counts seems to be constant. > Would it mean that running 20 isolates terminates faster that running 2 or > 3? > > I suspect, that in my application the remaining isolate that does not > terminate the execution of the running JS code is the "first" isolate. > > Do you have any idea, what conditions could cause to prevent > the termination of execution of JS Code? > Timing constraints, debugging ports, common global object, ...? > > Thank you, > > Laszlo > > On Thursday, 4 April 2013 15:45:25 UTC+2, Jakob Kummerow wrote: > >> TerminateExecution() does not send a kill signal to the process/thread or >> anything like that. It sets a flag that requests termination of currently >> running generated code for JS functions. Execution in loops isn't >> necessarily terminated immediately, several iterations of the loop may >> still happen (this depends on the length of the loop). The idea is that you >> can quickly gain control over long-running scripts ("Your browser tab is >> hanging, would you like to stop it?"). V8 does not have, and in my opinion >> does not need, a mechanism to interrupt v8::internal::OS::Sleep(), as this >> is never called from JS (in vanilla V8). >> >> The reason your alternative "DoSleep" implementation terminates much >> quicker is because the C++ function finishes much sooner, returning control >> to JS, which in turn is interrupted after a couple of loop iterations. I'm >> willing to bet that if you reduce the sleeping interval from 500ms to, say, >> 1ms in the other implementation, you'll observe much quicker termination >> there (and, conversely, if you wait long enough, the 500ms version will >> terminate eventually). >> >> Long story short: v8::TerminateExecution() is not designed to interrupt >> v8::internal::OS::Sleep(), nor any other function or FunctionTemplate >> implemented in C++. If you want to be able to have sleeping threads and >> terminate them, you'll have to use either another sleep implementation, or >> another way to request termination. (Where "use another" means "implement >> your own".) >> >> >> On Thu, Apr 4, 2013 at 10:16 AM, Laszlo Szakony <laszlo....@certec.at>wrote: >> >>> Hi, >>> >>> I'm using v8 - v8_13185_v3.15.11 - on Windows, Win7 64bit in >>> multi-threaded environment: several scripts are running parallel. >>> At an arbitrary time I want to terminate certain running scripts or >>> maybe all from another thread. Some of the scripts may have infinite loops. >>> Everything works fine, until some scripts call dosleep() in a >>> FunctionTemplate defined as follows: >>> >>> (In thread script[n]) >>> >>> v8::Handle<v8::Value> DoSleep(const v8::Arguments& args) {**** >>> >>> int millisec = args[0]->ToInt32()->**Int32Value();**** >>> >>> if (millisec)**** >>> >>> {**** >>> >>> v8::Unlocker unlock;**** >>> >>> v8::internal::OS::Sleep(**millisec);**** >>> >>> }**** >>> >>> return v8::Undefined();**** >>> >>> }**** >>> >>> …**** >>> >>> v8::Handle<v8::ObjectTemplate> global = v8::ObjectTemplate::New();**** >>> >>> global->Set(v8::String::New("**dosleep"), v8::FunctionTemplate::New(** >>> DoSleep));**** >>> >>> …**** >>> >>> The JavaScript Code looks sg. like this:**** >>> >>> v8::Script::Compile(v8::**String::New("function f() { while(true) >>> {dosleep(500);} } f()"))->Run();**** >>> >>> ** ** >>> >>> In the main thread I call:**** >>> >>> v8::Locker locker;**** >>> >>> for (int i = 0; i < kThreads; i++) {**** >>> >>> v8::V8::TerminateExecution(**threads[i]->GetV8ThreadId());**** >>> >>> ** ** >>> >>> The threads calling dosleep() won`t terminate. If I change the DoSleep() >>> Function() to:**** >>> >>> v8::Handle<v8::Value> DoSleep(const v8::Arguments& args) {**** >>> >>> int millisec = args[0]->ToInt32()->**Int32Value();**** >>> >>> if (millisec)**** >>> >>> {**** >>> >>> v8::Unlocker unlock;**** >>> >>> for (int i = count; i--;) for (int j = 1000; j--;) ;**** >>> >>> }**** >>> >>> return v8::Undefined();**** >>> >>> } >>> >>> >>> then the threads calling dosleep() will be terminated.**** >>> >>> I have modified test-thread-termination.cc to demonstrate the behavior. >>> After replacing test-thread-termination.cc with the attached one and >>> compiling of ccttest the tests can be called by:**** >>> >>> C:\v8_13185_v3.15.11\build\**Release>cctest test-thread-termination/** >>> TerminateMultipleV8ThreadsWith**DelayDefaultIsolate => OK**** >>> >>> C:\v8_13185_v3.15.11\build\**Release>cctest test-thread-termination/** >>> TerminateMultipleV8ThreadsWith**SleepDefaultIsolate => Failed: no >>> termination**** >>> >>> >>> Is this a bug? If not, how can I terminate scripts calling sleep()? >>> >>> >>> Thank you, >>> >>> Laszlo >>> >>> -- >>> -- >>> v8-users mailing list >>> v8-u...@googlegroups.com >>> >>> http://groups.google.com/**group/v8-users<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<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. > > > -- -- 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.