Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/nodejs/node.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRyan <ry@tinyclouds.org>2009-04-29 13:00:46 +0400
committerRyan <ry@tinyclouds.org>2009-04-29 13:00:46 +0400
commitf213a276572a02fa9997c6e0375dc6de1a7333ba (patch)
tree6a1b5c851416eef3043c6a0df598d33c02a9414c /src/timers.cc
parent064c8f0252026e892cae39dcaa9d89a6b932621a (diff)
Refactor setTimeout to be a Timer object.
Timer now uses ObjectWrap. setTimeout, setInterval are now implemented in javascript.
Diffstat (limited to 'src/timers.cc')
-rw-r--r--src/timers.cc146
1 files changed, 0 insertions, 146 deletions
diff --git a/src/timers.cc b/src/timers.cc
deleted file mode 100644
index 7e23662c1d8..00000000000
--- a/src/timers.cc
+++ /dev/null
@@ -1,146 +0,0 @@
-#include "node.h"
-#include "timers.h"
-#include <assert.h>
-
-using namespace v8;
-
-static Persistent<ObjectTemplate> timer_template;
-
-class Timer {
- public:
- Timer(Handle<Function> callback, ev_tstamp after, ev_tstamp repeat);
- ~Timer();
-
- static Handle<Value> setTimeout (const Arguments& args);
- static Handle<Value> setInterval (const Arguments& args);
- static Handle<Value> clearTimeout (const Arguments& args);
-
- Persistent<Object> handle_;
-
- private:
- static Timer* Unwrap (Handle<Object> handle);
- static void OnTimeout (EV_P_ ev_timer *watcher, int revents);
- ev_timer watcher_;
-};
-
-Timer*
-Timer::Unwrap (Handle<Object> handle)
-{
- HandleScope scope;
- Handle<External> field = Handle<External>::Cast(handle->GetInternalField(0));
- Timer* timer = static_cast<Timer*>(field->Value());
- return timer;
-}
-
-void
-Timer::OnTimeout (EV_P_ ev_timer *watcher, int revents)
-{
- Timer *timer = static_cast<Timer*>(watcher->data);
-
- HandleScope scope;
-
- Local<Value> callback_value = timer->handle_->Get(String::NewSymbol("callback"));
- if (!callback_value->IsFunction())
- return;
-
- Local<Function> callback = Local<Function>::Cast(callback_value);
-
- TryCatch try_catch;
- callback->Call (Context::GetCurrent()->Global(), 0, NULL);
- if(try_catch.HasCaught())
- node::fatal_exception(try_catch);
-
- // use ev_is_active instead?
- if(watcher->repeat == 0.)
- delete timer;
-}
-
-Timer::Timer (Handle<Function> callback, ev_tstamp after, ev_tstamp repeat)
-{
- HandleScope scope;
-
- handle_ = Persistent<Object>::New(timer_template->NewInstance());
- handle_->Set(String::NewSymbol("callback"), callback);
-
- Local<External> external = External::New(this);
- handle_->SetInternalField(0, external);
-
- ev_timer_init(&watcher_, Timer::OnTimeout, after, repeat);
- watcher_.data = this;
-
- ev_timer_start(EV_DEFAULT_UC_ &watcher_);
-}
-
-Timer::~Timer ()
-{
- ev_timer_stop (EV_DEFAULT_UC_ &watcher_);
- handle_->SetInternalField(0, Undefined());
- handle_.Dispose();
-}
-
-Handle<Value>
-Timer::setTimeout (const Arguments& args)
-{
- if (args.Length() < 2)
- return Undefined();
-
- HandleScope scope;
-
- Local<Function> callback = Local<Function>::Cast(args[0]);
- int delay = args[1]->IntegerValue();
-
- ev_tstamp after = (double)delay / 1000.0;
-
- if (args.Length() > 2)
- assert(0 && "extra params to setTimeout not yet implemented.");
-
- Timer *timer = new Timer(callback, after, 0.0);
-
- return scope.Close(timer->handle_);
-}
-
-Handle<Value>
-Timer::setInterval (const Arguments& args)
-{
- if (args.Length() < 2)
- return Undefined();
-
- HandleScope scope;
-
- Local<Function> callback = Local<Function>::Cast(args[0]);
- int delay = args[1]->IntegerValue();
-
- ev_tstamp after = (double)delay / 1000.0;
-
- Timer *timer = new Timer(callback, after, after);
-
- return scope.Close(timer->handle_);
-}
-
-Handle<Value>
-Timer::clearTimeout (const Arguments& args)
-{
- if (args.Length() < 1)
- return Undefined();
-
- HandleScope scope;
- Local<Object> handle = Local<Object>::Cast(args[0]);
- Timer *timer = Timer::Unwrap(handle);
- delete timer;
-
- return Undefined();
-}
-
-void
-node::Init_timers (Handle<Object> target)
-{
- HandleScope scope;
-
- timer_template = Persistent<ObjectTemplate>::New(ObjectTemplate::New());
- timer_template->SetInternalFieldCount(1);
-
- NODE_SET_METHOD(target, "setTimeout", Timer::setTimeout);
- NODE_SET_METHOD(target, "setInterval", Timer::setInterval);
- NODE_SET_METHOD(target, "clearTimeout", Timer::clearTimeout);
- NODE_SET_METHOD(target, "clearInterval", Timer::clearTimeout);
-}