watchdog: terminate one specific isolate
This commit is contained in:
parent
d78a3787d2
commit
d5198768de
@ -646,14 +646,14 @@ class ContextifyScript : public BaseObject {
|
|||||||
|
|
||||||
Local<Value> result;
|
Local<Value> result;
|
||||||
if (timeout != -1) {
|
if (timeout != -1) {
|
||||||
Watchdog wd(timeout);
|
Watchdog wd(env, timeout);
|
||||||
result = script->Run();
|
result = script->Run();
|
||||||
} else {
|
} else {
|
||||||
result = script->Run();
|
result = script->Run();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (try_catch.HasCaught() && try_catch.HasTerminated()) {
|
if (try_catch.HasCaught() && try_catch.HasTerminated()) {
|
||||||
V8::CancelTerminateExecution(args.GetIsolate());
|
V8::CancelTerminateExecution(env->isolate());
|
||||||
env->ThrowError("Script execution timed out.");
|
env->ThrowError("Script execution timed out.");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -20,6 +20,8 @@
|
|||||||
// USE OR OTHER DEALINGS IN THE SOFTWARE.
|
// USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
|
||||||
#include "node_watchdog.h"
|
#include "node_watchdog.h"
|
||||||
|
#include "env.h"
|
||||||
|
#include "env-inl.h"
|
||||||
#include "util.h"
|
#include "util.h"
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
|
|
||||||
@ -28,7 +30,8 @@ namespace node {
|
|||||||
using v8::V8;
|
using v8::V8;
|
||||||
|
|
||||||
|
|
||||||
Watchdog::Watchdog(uint64_t ms) : destroyed_(false) {
|
Watchdog::Watchdog(Environment* env, uint64_t ms) : env_(env),
|
||||||
|
destroyed_(false) {
|
||||||
int rc;
|
int rc;
|
||||||
loop_ = new uv_loop_t;
|
loop_ = new uv_loop_t;
|
||||||
CHECK(loop_);
|
CHECK(loop_);
|
||||||
@ -98,7 +101,8 @@ void Watchdog::Async(uv_async_t* async) {
|
|||||||
|
|
||||||
|
|
||||||
void Watchdog::Timer(uv_timer_t* timer) {
|
void Watchdog::Timer(uv_timer_t* timer) {
|
||||||
V8::TerminateExecution();
|
Watchdog* w = ContainerOf(&Watchdog::timer_, timer);
|
||||||
|
V8::TerminateExecution(w->env()->isolate());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -25,15 +25,19 @@
|
|||||||
#include "v8.h"
|
#include "v8.h"
|
||||||
#include "uv.h"
|
#include "uv.h"
|
||||||
|
|
||||||
|
#include "env.h"
|
||||||
|
|
||||||
namespace node {
|
namespace node {
|
||||||
|
|
||||||
class Watchdog {
|
class Watchdog {
|
||||||
public:
|
public:
|
||||||
explicit Watchdog(uint64_t ms);
|
explicit Watchdog(Environment* env, uint64_t ms);
|
||||||
~Watchdog();
|
~Watchdog();
|
||||||
|
|
||||||
void Dispose();
|
void Dispose();
|
||||||
|
|
||||||
|
inline Environment* env() const { return env_; }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void Destroy();
|
void Destroy();
|
||||||
|
|
||||||
@ -41,6 +45,7 @@ class Watchdog {
|
|||||||
static void Async(uv_async_t* async);
|
static void Async(uv_async_t* async);
|
||||||
static void Timer(uv_timer_t* timer);
|
static void Timer(uv_timer_t* timer);
|
||||||
|
|
||||||
|
Environment* env_;
|
||||||
uv_thread_t thread_;
|
uv_thread_t thread_;
|
||||||
uv_loop_t* loop_;
|
uv_loop_t* loop_;
|
||||||
uv_async_t async_;
|
uv_async_t async_;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user