mirror of https://github.com/lukechilds/node.git
Browse Source
Add a watchdog class which executes a timer in a separate event loop in a separate thread that will terminate v8 execution if it expires. Add timeout argument to functions in vm module which use the watchdog if a non-zero timeout is specified.v0.11.2-release
Andrew Paprocki
12 years ago
committed by
Ben Noordhuis
8 changed files with 252 additions and 20 deletions
@ -0,0 +1,99 @@ |
|||||
|
// Copyright Joyent, Inc. and other Node contributors.
|
||||
|
//
|
||||
|
// Permission is hereby granted, free of charge, to any person obtaining a
|
||||
|
// copy of this software and associated documentation files (the
|
||||
|
// "Software"), to deal in the Software without restriction, including
|
||||
|
// without limitation the rights to use, copy, modify, merge, publish,
|
||||
|
// distribute, sublicense, and/or sell copies of the Software, and to permit
|
||||
|
// persons to whom the Software is furnished to do so, subject to the
|
||||
|
// following conditions:
|
||||
|
//
|
||||
|
// The above copyright notice and this permission notice shall be included
|
||||
|
// in all copies or substantial portions of the Software.
|
||||
|
//
|
||||
|
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||
|
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
|
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
|
||||
|
// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
|
||||
|
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
|
||||
|
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
|
||||
|
// USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
|
||||
|
#include "node_watchdog.h" |
||||
|
|
||||
|
namespace node { |
||||
|
|
||||
|
using v8::V8; |
||||
|
|
||||
|
|
||||
|
Watchdog::Watchdog(uint64_t ms) |
||||
|
: timer_started_(false) |
||||
|
, thread_created_(false) |
||||
|
, destroyed_(false) { |
||||
|
|
||||
|
loop_ = uv_loop_new(); |
||||
|
if (!loop_) |
||||
|
return; |
||||
|
|
||||
|
int rc = uv_timer_init(loop_, &timer_); |
||||
|
if (rc) { |
||||
|
return; |
||||
|
} |
||||
|
|
||||
|
rc = uv_timer_start(&timer_, &Watchdog::Timer, ms, 0); |
||||
|
if (rc) { |
||||
|
return; |
||||
|
} |
||||
|
timer_started_ = true; |
||||
|
|
||||
|
rc = uv_thread_create(&thread_, &Watchdog::Run, this); |
||||
|
if (rc) { |
||||
|
return; |
||||
|
} |
||||
|
thread_created_ = true; |
||||
|
} |
||||
|
|
||||
|
|
||||
|
Watchdog::~Watchdog() { |
||||
|
Destroy(); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
void Watchdog::Dispose() { |
||||
|
Destroy(); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
void Watchdog::Destroy() { |
||||
|
if (destroyed_) { |
||||
|
return; |
||||
|
} |
||||
|
|
||||
|
if (timer_started_) { |
||||
|
uv_timer_stop(&timer_); |
||||
|
} |
||||
|
|
||||
|
if (loop_) { |
||||
|
uv_loop_delete(loop_); |
||||
|
} |
||||
|
|
||||
|
if (thread_created_) { |
||||
|
uv_thread_join(&thread_); |
||||
|
} |
||||
|
|
||||
|
destroyed_ = true; |
||||
|
} |
||||
|
|
||||
|
|
||||
|
void Watchdog::Run(void* arg) { |
||||
|
Watchdog* wd = static_cast<Watchdog*>(arg); |
||||
|
uv_run(wd->loop_, UV_RUN_DEFAULT); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
void Watchdog::Timer(uv_timer_t* timer, int status) { |
||||
|
V8::TerminateExecution(); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
} // namespace node
|
@ -0,0 +1,53 @@ |
|||||
|
// Copyright Joyent, Inc. and other Node contributors.
|
||||
|
//
|
||||
|
// Permission is hereby granted, free of charge, to any person obtaining a
|
||||
|
// copy of this software and associated documentation files (the
|
||||
|
// "Software"), to deal in the Software without restriction, including
|
||||
|
// without limitation the rights to use, copy, modify, merge, publish,
|
||||
|
// distribute, sublicense, and/or sell copies of the Software, and to permit
|
||||
|
// persons to whom the Software is furnished to do so, subject to the
|
||||
|
// following conditions:
|
||||
|
//
|
||||
|
// The above copyright notice and this permission notice shall be included
|
||||
|
// in all copies or substantial portions of the Software.
|
||||
|
//
|
||||
|
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||
|
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
|
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
|
||||
|
// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
|
||||
|
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
|
||||
|
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
|
||||
|
// USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
|
||||
|
#ifndef SRC_NODE_WATCHDOG_H_ |
||||
|
#define SRC_NODE_WATCHDOG_H_ |
||||
|
|
||||
|
#include "v8.h" |
||||
|
#include "uv.h" |
||||
|
|
||||
|
namespace node { |
||||
|
|
||||
|
class Watchdog { |
||||
|
public: |
||||
|
Watchdog(uint64_t ms); |
||||
|
~Watchdog(); |
||||
|
|
||||
|
void Dispose(); |
||||
|
|
||||
|
private: |
||||
|
void Destroy(); |
||||
|
|
||||
|
static void Run(void* arg); |
||||
|
static void Timer(uv_timer_t* timer, int status); |
||||
|
|
||||
|
uv_thread_t thread_; |
||||
|
uv_loop_t* loop_; |
||||
|
uv_timer_t timer_; |
||||
|
bool timer_started_; |
||||
|
bool thread_created_; |
||||
|
bool destroyed_; |
||||
|
}; |
||||
|
|
||||
|
} // namespace node
|
||||
|
|
||||
|
#endif // SRC_NODE_WATCHDOG_H_
|
@ -0,0 +1,37 @@ |
|||||
|
// Copyright Joyent, Inc. and other Node contributors.
|
||||
|
//
|
||||
|
// Permission is hereby granted, free of charge, to any person obtaining a
|
||||
|
// copy of this software and associated documentation files (the
|
||||
|
// "Software"), to deal in the Software without restriction, including
|
||||
|
// without limitation the rights to use, copy, modify, merge, publish,
|
||||
|
// distribute, sublicense, and/or sell copies of the Software, and to permit
|
||||
|
// persons to whom the Software is furnished to do so, subject to the
|
||||
|
// following conditions:
|
||||
|
//
|
||||
|
// The above copyright notice and this permission notice shall be included
|
||||
|
// in all copies or substantial portions of the Software.
|
||||
|
//
|
||||
|
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||
|
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
|
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
|
||||
|
// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
|
||||
|
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
|
||||
|
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
|
||||
|
// USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
|
||||
|
var common = require('../common'); |
||||
|
var assert = require('assert'); |
||||
|
var vm = require('vm'); |
||||
|
|
||||
|
assert.throws(function() { |
||||
|
vm.runInThisContext('while(true) {}', '', 100); |
||||
|
}); |
||||
|
|
||||
|
assert.throws(function() { |
||||
|
vm.runInThisContext('', '', -1); |
||||
|
}); |
||||
|
|
||||
|
assert.doesNotThrow(function() { |
||||
|
vm.runInThisContext('', '', 0); |
||||
|
vm.runInThisContext('', '', 100); |
||||
|
}); |
Loading…
Reference in new issue