ref isolate loop
authorIgor Zinkovsky <igorzi@microsoft.com>
Fri, 20 Jan 2012 02:56:23 +0000 (18:56 -0800)
committerIgor Zinkovsky <igorzi@microsoft.com>
Sat, 21 Jan 2012 02:03:05 +0000 (18:03 -0800)
src/node.cc
src/node.js
src/node_isolate.cc
src/node_isolate.h
test/simple/test-isolates0.js

index 7080317..5ae4f0c 100644 (file)
@@ -2649,6 +2649,9 @@ void StartThread(node::Isolate* isolate,
   if (isolate->id_ > 1) {
     process_l->Set(String::NewSymbol("_send"),
                    FunctionTemplate::New(Isolate::Send)->GetFunction());
+
+    process_l->Set(String::NewSymbol("_exit"),
+                   FunctionTemplate::New(Isolate::Unref)->GetFunction());
   }
 
   // FIXME crashes with "CHECK(heap->isolate() == Isolate::Current()) failed"
index 1be0490..4d382af 100644 (file)
       msg = JSON.parse('' + msg);
       process.emit('message', msg);
     };
+
+    process.exit = process._exit;
   }
 
   startup.globalVariables = function() {
index 52cf090..a0d2c45 100644 (file)
@@ -215,6 +215,16 @@ Handle<Value> Isolate::Send(const Arguments& args) {
 }
 
 
+Handle<Value> Isolate::Unref(const Arguments& args) {
+  HandleScope scope;
+
+  Isolate* isolate = Isolate::GetCurrent();
+  uv_unref(isolate->loop_);
+
+  return Undefined();
+}
+
+
 void Isolate::OnMessage(IsolateMessage* msg, void* arg) {
   HandleScope scope;
 
@@ -270,6 +280,11 @@ Isolate::Isolate() {
   assert(v8_isolate_->GetData() == NULL);
   v8_isolate_->SetData(this);
 
+  // Artificially ref the isolate loop so that the child
+  // isolate stays alive by default.  process.exit will
+  // unref the loop (see Isolate::Unref).
+  uv_ref(loop_);
+
   globals_init_ = false;
 }
 
index b08ecf3..12e5921 100644 (file)
@@ -74,6 +74,7 @@ public:
   typedef void (*AtExitCallback)(void* arg);
 
   static v8::Handle<v8::Value> Send(const v8::Arguments& args);
+  static v8::Handle<v8::Value> Unref(const v8::Arguments& args);
 
   static Isolate* GetCurrent() {
     return reinterpret_cast<Isolate*>(v8::Isolate::GetCurrent()->GetData());
index d06628f..b85fc63 100644 (file)
@@ -52,6 +52,7 @@ if (process.tid === 1) {
     fs.stat(__dirname, function(err, stat) {
       if (err) throw err;
       console.error('thread 2', stat.mtime);
+      process.exit();
     });
   }, 500);