watchdog: terminate one specific isolate
authorFedor Indutny <fedor@indutny.com>
Thu, 12 Jun 2014 18:21:26 +0000 (11:21 -0700)
committerFedor Indutny <fedor@indutny.com>
Fri, 13 Jun 2014 01:30:26 +0000 (18:30 -0700)
src/node_contextify.cc
src/node_watchdog.cc
src/node_watchdog.h

index 48121be..3937fd6 100644 (file)
@@ -646,14 +646,14 @@ class ContextifyScript : public BaseObject {
 
     Local<Value> result;
     if (timeout != -1) {
-      Watchdog wd(timeout);
+      Watchdog wd(env, timeout);
       result = script->Run();
     } else {
       result = script->Run();
     }
 
     if (try_catch.HasCaught() && try_catch.HasTerminated()) {
-      V8::CancelTerminateExecution(args.GetIsolate());
+      V8::CancelTerminateExecution(env->isolate());
       env->ThrowError("Script execution timed out.");
       return false;
     }
index afa2a7b..a71a906 100644 (file)
@@ -20,6 +20,8 @@
 // USE OR OTHER DEALINGS IN THE SOFTWARE.
 
 #include "node_watchdog.h"
+#include "env.h"
+#include "env-inl.h"
 #include "util.h"
 #include <assert.h>
 
@@ -28,7 +30,8 @@ namespace node {
 using v8::V8;
 
 
-Watchdog::Watchdog(uint64_t ms) : destroyed_(false) {
+Watchdog::Watchdog(Environment* env, uint64_t ms) : env_(env),
+                                                    destroyed_(false) {
   int rc;
   loop_ = new uv_loop_t;
   CHECK(loop_);
@@ -98,7 +101,8 @@ void Watchdog::Async(uv_async_t* async) {
 
 
 void Watchdog::Timer(uv_timer_t* timer) {
-  V8::TerminateExecution();
+  Watchdog* w = ContainerOf(&Watchdog::timer_, timer);
+  V8::TerminateExecution(w->env()->isolate());
 }
 
 
index e1105d1..284c65d 100644 (file)
 #include "v8.h"
 #include "uv.h"
 
+#include "env.h"
+
 namespace node {
 
 class Watchdog {
  public:
-  explicit Watchdog(uint64_t ms);
+  explicit Watchdog(Environment* env, uint64_t ms);
   ~Watchdog();
 
   void Dispose();
 
+  inline Environment* env() const { return env_; }
+
  private:
   void Destroy();
 
@@ -41,6 +45,7 @@ class Watchdog {
   static void Async(uv_async_t* async);
   static void Timer(uv_timer_t* timer);
 
+  Environment* env_;
   uv_thread_t thread_;
   uv_loop_t* loop_;
   uv_async_t async_;