diff options
author | Fedor Indutny <fedor@indutny.com> | 2015-04-03 01:14:08 +0300 |
---|---|---|
committer | Fedor Indutny <fedor@indutny.com> | 2015-04-04 02:31:47 +0300 |
commit | d22b2a934a62087522511e1e6b66b71370506c77 (patch) | |
tree | 06178bc4e397910a2c9a76e5822d0a5217111a79 /src/timer_wrap.cc | |
parent | cca5efb086b0c9d0e78be3ce0b9690f16e6f0ad9 (diff) |
timers: do not restart the interval after close
Partially revert 776b73b24306bac0ce299df4f90b7645d5efca31.
Following code crashes after backported timer leak fixes:
```javascript
var timer = setInterval(function() {
clearInterval(timer);
}, 10);
timer.unref();
```
Note that this is actually tested in a `test-timers-unref.js`, and is
crashing only with 776b73b24306bac0ce299df4f90b7645d5efca31.
Calling `clearInterval` leads to the crashes in case of `.unref()`ed
timers, and might lead to a extra timer spin in case of regular
intervals that was closed during the interval callback. All of these
happens because `.unref()`ed timer has it's own `_handle` and was used
after the `.close()`.
PR-URL: https://github.com/iojs/io.js/pull/1330
Reviewed-by: Trevor Norris <trev.norris@gmail.com>
Diffstat (limited to 'src/timer_wrap.cc')
-rw-r--r-- | src/timer_wrap.cc | 10 |
1 files changed, 10 insertions, 0 deletions
diff --git a/src/timer_wrap.cc b/src/timer_wrap.cc index d71213f2202..f65290a5162 100644 --- a/src/timer_wrap.cc +++ b/src/timer_wrap.cc @@ -73,6 +73,8 @@ class TimerWrap : public HandleWrap { static void Start(const FunctionCallbackInfo<Value>& args) { TimerWrap* wrap = Unwrap<TimerWrap>(args.Holder()); + CHECK(HandleWrap::IsAlive(wrap)); + int64_t timeout = args[0]->IntegerValue(); int64_t repeat = args[1]->IntegerValue(); int err = uv_timer_start(&wrap->handle_, OnTimeout, timeout, repeat); @@ -82,6 +84,8 @@ class TimerWrap : public HandleWrap { static void Stop(const FunctionCallbackInfo<Value>& args) { TimerWrap* wrap = Unwrap<TimerWrap>(args.Holder()); + CHECK(HandleWrap::IsAlive(wrap)); + int err = uv_timer_stop(&wrap->handle_); args.GetReturnValue().Set(err); } @@ -89,6 +93,8 @@ class TimerWrap : public HandleWrap { static void Again(const FunctionCallbackInfo<Value>& args) { TimerWrap* wrap = Unwrap<TimerWrap>(args.Holder()); + CHECK(HandleWrap::IsAlive(wrap)); + int err = uv_timer_again(&wrap->handle_); args.GetReturnValue().Set(err); } @@ -96,6 +102,8 @@ class TimerWrap : public HandleWrap { static void SetRepeat(const FunctionCallbackInfo<Value>& args) { TimerWrap* wrap = Unwrap<TimerWrap>(args.Holder()); + CHECK(HandleWrap::IsAlive(wrap)); + int64_t repeat = args[0]->IntegerValue(); uv_timer_set_repeat(&wrap->handle_, repeat); args.GetReturnValue().Set(0); @@ -104,6 +112,8 @@ class TimerWrap : public HandleWrap { static void GetRepeat(const FunctionCallbackInfo<Value>& args) { TimerWrap* wrap = Unwrap<TimerWrap>(args.Holder()); + CHECK(HandleWrap::IsAlive(wrap)); + int64_t repeat = uv_timer_get_repeat(&wrap->handle_); if (repeat <= 0xfffffff) args.GetReturnValue().Set(static_cast<uint32_t>(repeat)); |