diff --git a/src/net.h b/src/net.h index 7ba05fec58..5852f3e7ff 100644 --- a/src/net.h +++ b/src/net.h @@ -33,7 +33,9 @@ protected: Connection (v8::Handle handle); virtual ~Connection (); - int Connect (struct addrinfo *address) { return oi_socket_connect (&socket_, address); } + int Connect (struct addrinfo *address) { + return oi_socket_connect (&socket_, address); + } void Send (oi_buf *buf) { oi_socket_write(&socket_, buf); } void Close (void) { oi_socket_close(&socket_); } void FullClose (void) { oi_socket_full_close(&socket_); } @@ -66,12 +68,10 @@ private: static void on_read (oi_socket *s, const void *buf, size_t len) { Connection *connection = static_cast (s->data); - v8::V8::ResumeProfiler(); if (len == 0) connection->OnEOF(); else connection->OnReceive(buf, len); - v8::V8::PauseProfiler(); } static void on_drain (oi_socket *s) { diff --git a/src/node.cc b/src/node.cc index ba8df9a43a..31005d91b1 100644 --- a/src/node.cc +++ b/src/node.cc @@ -280,67 +280,44 @@ ExecuteNativeJS (const char *filename, const char *data) } } -int -main (int argc, char *argv[]) +static Local +Load (int argc, char *argv[]) { - ev_default_loop(EVFLAG_AUTO); // initialize the default ev loop. - - // start eio thread pool - ev_async_init(&eio_watcher, node_eio_cb); - eio_init(eio_want_poll, NULL); - - V8::SetFlagsFromCommandLine(&argc, argv, true); - V8::Initialize(); - - if(argc < 2) { - fprintf(stderr, "No script was specified.\n"); - return 1; - } - - string filename(argv[1]); - - HandleScope handle_scope; - - Persistent context = Context::New(NULL, ObjectTemplate::New()); - Context::Scope context_scope(context); - V8::SetFatalErrorHandler(OnFatalError); - - Local g = Context::GetCurrent()->Global(); - - V8::PauseProfiler(); // to be resumed in Connection::on_read + HandleScope scope; - Local node = Object::New(); - g->Set(String::New("node"), node); + Local global_obj = Context::GetCurrent()->Global(); + Local node_obj = Object::New(); - NODE_SET_METHOD(node, "compile", compile); // internal - NODE_SET_METHOD(node, "debug", debug); - NODE_SET_METHOD(node, "reallyExit", node_exit); + global_obj->Set(String::NewSymbol("node"), node_obj); Local arguments = Array::New(argc); for (int i = 0; i < argc; i++) { Local arg = String::New(argv[i]); arguments->Set(Integer::New(i), arg); } - g->Set(String::New("ARGV"), arguments); + global_obj->Set(String::NewSymbol("ARGV"), arguments); - // BUILT-IN MODULES - Timer::Initialize(node); + NODE_SET_METHOD(node_obj, "compile", compile); + NODE_SET_METHOD(node_obj, "debug", debug); + NODE_SET_METHOD(node_obj, "reallyExit", node_exit); + + Timer::Initialize(node_obj); Local constants = Object::New(); - node->Set(String::New("constants"), constants); + node_obj->Set(String::NewSymbol("constants"), constants); DefineConstants(constants); Local fs = Object::New(); - node->Set(String::New("fs"), fs); + node_obj->Set(String::NewSymbol("fs"), fs); File::Initialize(fs); Local tcp = Object::New(); - node->Set(String::New("tcp"), tcp); + node_obj->Set(String::New("tcp"), tcp); Acceptor::Initialize(tcp); Connection::Initialize(tcp); Local http = Object::New(); - node->Set(String::New("http"), http); + node_obj->Set(String::New("http"), http); HTTPServer::Initialize(http); HTTPConnection::Initialize(http); @@ -348,25 +325,52 @@ main (int argc, char *argv[]) ExecuteNativeJS("file.js", native_file); ExecuteNativeJS("node.js", native_node); - ev_loop(EV_DEFAULT_UC_ 0); + return scope.Close(node_obj); +} - // call node.exit() - Local exit_v = node->Get(String::New("exit")); +static void +CallExitHandler (Handle node_obj) +{ + HandleScope scope; + Local exit_v = node_obj->Get(String::New("exit")); assert(exit_v->IsFunction()); Handle exit_f = Handle::Cast(exit_v); TryCatch try_catch; - exit_f->Call(g, 0, NULL); + exit_f->Call(Context::GetCurrent()->Global(), 0, NULL); if (try_catch.HasCaught()) node::FatalException(try_catch); +} + +int +main (int argc, char *argv[]) +{ + ev_default_loop(EVFLAG_AUTO); // initialize the default ev loop. + + // start eio thread pool + ev_async_init(&eio_watcher, node_eio_cb); + eio_init(eio_want_poll, NULL); + + V8::SetFlagsFromCommandLine(&argc, argv, true); + V8::Initialize(); + V8::SetFatalErrorHandler(OnFatalError); + + if(argc < 2) { + fprintf(stderr, "No script was specified.\n"); + return 1; + } + + HandleScope handle_scope; + Persistent context = Context::New(NULL, ObjectTemplate::New()); + Context::Scope context_scope(context); + + Local node_obj = Load(argc, argv); + + ev_loop(EV_DEFAULT_UC_ 0); // main event loop + + CallExitHandler(node_obj); context.Dispose(); - // The following line when uncommented causes an error. - // To reproduce do this: - // > node --prof test-http_simple.js - // - // > curl http://localhost:8000/quit/ - // - //V8::Dispose(); + V8::Dispose(); return 0; } diff --git a/website/index.html b/website/index.html index 989a4fca29..de0eaff468 100644 --- a/website/index.html +++ b/website/index.html @@ -194,9 +194,7 @@ make install

To run the tests

-
-./configure --debug
-make test
+
make test

Community