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